CF Educational Round 78 (Div2)题解报告A~E

A:Two Rival Students​

  • 依题意模拟即可

  • #include<bits/stdc++.h>
    using namespace std;
    int T;
    int n, x, a, b;
    int main()
    {
    cin >> T;
    while(T--)
    {
    cin >> n >> x >> a >> b;
    if(a > b) swap(a, b);
    while(x != 0)
    {
    if(a > 1) x--, a--;
    else if(a == 1) break;
    }
    while(x != 0)
    {
    if(b < n) x--, b++;
    else if(b == n) break;
    }
    cout << b - a << endl;
    }
    return 0;
    }

B: Magic Stick ​

  • 1,2,3会跑成循环,其他的只要不断扩大后减小就行,特判。

  • #include<bits/stdc++.h>
    using namespace std;
    int main()
    {
    int T;
    cin >> T;
    while(T--)
    {
    int x, y; cin >>x >> y;
    if(x >= y) {
    puts("YES"); continue;
    }
    else
    {
    if(x == 2 && y != 3) {
    puts("NO");
    continue;
    }
    if(x == 3 && y != 3)
    {
    puts("NO");
    continue;
    }
    if(x == 1 && y != 1)
    {
    puts("NO");
    continue;
    }
    }
    puts("YES");
    }
    return 0;
    }

C: Dominated Subarray

  • 线性扫一遍就好了,其实是查询相同的两个元素的距离最小是多少

  • #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 10;
    int a[maxn], T, n, vis[maxn]; int main()
    {
    scanf("%d", &T);
    while(T--)
    {
    scanf("%d", &n);
    int ans = 0x3f3f3f3f;
    for(int i = 1; i <= n; i++)
    {
    scanf("%d", &a[i]);
    vis[i] = 0;
    } for(int i = 1; i <= n; i++)
    {
    int x = a[i];
    if(vis[x]) ans = min(i-vis[x], ans);
    vis[x] = i;
    } if(ans == 0x3f3f3f3f) puts("-1");
    else cout << ans + 1<< endl;
    }
    return 0;
    }

D: Yet Another Monster Killing Problem

  • 二分+贪心

  • 首先特判英雄最高的攻击力和怪兽最大的生命值,不够就肯定打不完。

  • 对于英雄而言,如果两个英雄\((i,j)\)攻击力相同,但是\(i.s>j.s\),那么我们肯定不选择\(j\)而选择\(i\)。

  • 所以我们按照\(p\)进行排序,之后进行后缀操作\(b(i).s\)表示\(i\)~\(n\)最大耐力值。

  • 对于某个怪物而言,我们可以找到一个英雄他的攻击力恰好大于这个怪物,因为\(b\)已经针对\(p\)排好序了,所以我们可以二分找这个英雄。

  • 我们从第一天开始,枚举每个怪物,如果当前能杀死最多怪物的英雄,对于某个怪物而言,如果英雄的耐力不足以支持当前的操作,则开启新的一天,循环杀死所有怪物。

  • #include<bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 10;
    int T, n, m;
    int a[maxn]; struct Node{
    int p, s;
    }b[maxn]; bool cmp(Node a, Node b) {return a.p < b.p;}
    bool cmpp(Node x, int y) {return x.p < y;} int main()
    {
    cin >> T;
    while(T--)
    {
    int mx = 0;
    scanf("%d", &n);
    for(int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
    mx = max(mx, a[i]);
    }
    scanf("%d", &m);
    for(int i = 1, x, y; i <= m; i++)
    {
    scanf("%d%d", &x, &y);
    b[i] = {x, y};
    }
    sort(b+1, b+1+m, cmp);
    if(b[m].p < mx)
    {
    puts("-1");
    continue;
    } for(int i = m - 1; i >= 1; i--)
    b[i].s = max(b[i].s, b[i+1].s);
    int days = 1;
    int las = 0; //上一个怪物
    int cnt = 0x3f3f3f3f; //从上一个怪物杀到现在的英雄的最小耐力 for(int i = 1; i <= n; i++)
    {
    int t = lower_bound(b+1, b+m+1, a[i], cmpp) - b;
    cnt = min(b[t].s, cnt);
    if(cnt + las < i) //当前这只怪物杀不掉了
    {
    cnt = b[t].s;
    days += 1;
    las = i - 1;
    }
    }
    cout << days << endl;
    }
    return 0;
    }

E:The Contest

  • \(dp\)
  • \(f(i,1/2/3)\)表示第\(i\)个数放在第\(1,2,3\)个同学手上的最小操作数。
  • 对于初始状态\(x\)在第\(i\)个同学手上,有\(a(x)=i\)。
  • 有状态转移方程\(f(i,k) = min(f(i,k), f(i,j)+(k!=a(i+1)))\),其中\((1\leq j \leq3,j\leq k \leq 3)\)
    • 解释:因为\(1,2,3\)同学手上的序列数要单调,所以\(j\leq k\)。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 2e5 + 10;
int a[maxn], n;
int f[maxn][5]; int main()
{
int n1, n2, n3;
cin >> n1 >> n2 >> n3; n = n1 + n2 + n3;
for(int i = 1, x; i <= n1; i++)
scanf("%d", &x), a[x] = 1;
for(int i = 1, x; i <= n2; i++)
scanf("%d", &x), a[x] = 2;
for(int i = 1, x; i <= n3; i++)
scanf("%d", &x), a[x] = 3; memset(f, 0x3f, sizeof(f));
f[0][1] = f[0][2] = f[0][3] = 0; for(int i = 0; i <= n - 1; i++)
for(int j = 1; j <= 3; j++)
for(int k = j; k <= 3; k++)
f[i+1][k] = min(f[i+1][k], f[i][j] + (k != a[i+1])); cout << min(min(f[n][1], f[n][2]), f[n][3]) << endl; return 0;
}

F: Make Them Similar 待补。

CF Educational Round 78 (Div2)题解报告A~E的更多相关文章

  1. CF Round #580(div2)题解报告

    CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...

  2. Codeforces Educational Round 92 赛后解题报告(A-G)

    Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...

  3. CF1169(div2)题解报告

    CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...

  4. Codeforces Round#320 Div2 解题报告

    Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...

  5. Codeforces Round#704 Div2 题解(A,B,C,D,E)

    FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...

  6. [CF]codeforces round 369(div2)

    *明早起来再贴代码 A [题意] 给定n*5的方格 将横向的相邻两个变成+输出 [题解] ... B [题意] 一个n*n的正整数矩阵,有且仅有一个数为0 ,在这个位置填上一个数,使得每一列的和 每一 ...

  7. [CF]codeforces round#366(div2)滚粗记

    开场心理活动:啊打完这场大概有1700了吧 中途心理活动:啊这个ABC看起来都随便做啊 死亡原因:欸怎么没网了 -75 .. A [题意]Hulk说完一句I hate会说that I love 然后是 ...

  8. CodeForces round 967 div2 题解(A~E)

    本来准备比完赛就写题解的, 但是一拖拖了一星期, 唉 最后一题没搞懂怎么做,恳请大神指教 欢迎大家在评论区提问. A Mind the Gap 稳定版题面 https://cn.vjudge.net/ ...

  9. Codeforces Round #407 div2 题解【ABCDE】

    Anastasia and pebbles 题意:你有两种框,每个框可以最多装k重量的物品,但是你每个框不能装不一样的物品.现在地面上有n个物品,问你最少多少次,可以把这n个物品全部装回去. 题解:其 ...

随机推荐

  1. LeetCode 167:两数之和 II - 输入有序数组 Two Sum II - Input array is sorted

    公众号: 爱写bug(ID:icodebugs) 给定一个已按照升序排列 的有序数组,找到两个数使得它们相加之和等于目标数. 函数应该返回这两个下标值 index1 和 index2,其中 index ...

  2. Oracle性能调优之虚拟索引用法简介

    本博客记录一下Oracle虚拟索引的用法,虚拟索引是定义在数据字典中的伪索引,可以说是伪列,没有修改的索引字段的.虚拟索引的目的模拟索引,不会增加存储空间的使用,有了虚拟索引,开发者使用执行计划的时候 ...

  3. Fiddler抓包工具怎么设置HTTPS抓包

    最近在学习使用 Fiddler 抓包工具时遇到一个问题,Fiddler 默认只对 HTTP 协议进行抓包,如果出现下图提示,则需要进行相应设置才可以抓包HTTPS 具体步骤 ①:Tools-Optio ...

  4. 机器学习之Artificial Neural Networks

    人类通过模仿自然界中的生物,已经发明了很多东西,比如飞机,就是模仿鸟翼,但最终,这些东西会和原来的东西有些许差异,artificial neural networks (ANNs)就是模仿动物大脑的神 ...

  5. Java并发专栏(一)—— Process vs Thread

    一.前言 程序是代码和数据的集合,是一种静态实体.不具有代码执行和数据处理的能力,更多是一种行为的描述. 如果将程序和处理器结合,处理器将程序加载至内存,然后执行程序代码处理数据.这时就是可执行的程序 ...

  6. UNION ALL \UNION

    (一)UNION ALL \UNION 的用法和区别   UNION UNION    ALL 用途   用于使用SELECT语句组合两个或多个表的结果集. 用于使用SELECT语句组合两个或多个表的 ...

  7. ASP.NET MVC中Log4Net记录错误日志的使用

    第一.在管理NuGet程序包 =>下载 Log4Net 第二.在web.config配置Log4Net 1:在<configuration>节点下 <configSection ...

  8. 我为什么学习Haskell

    说起来,Haskell真是相当冷门而小众的一门语言.在我工作第一年的时候,我平时从网络的一些学习资料上时不时看到有人提到这门语言.那时候的认识就是除了我们平时用的“面向对象语言 (OOP: Objec ...

  9. 基于NPOI对Excel进行简单的操作

    1. 关于NPOI NPOI是一个开源的用于在C#程序中读写Excel.WORD等微软OLE2组件文档的项目,使用NPOI可以在没有安装Office的情况下对Word或Excel文档进行读写操作. 2 ...

  10. javascript中的12种循环遍历方法1

    1:for循环 let arr = [1,2,3]; for(let i =0;i<arr.length;i++){ console.log(i,arr[i]) } //for循环是js中最常用 ...