CF Educational Round 78 (Div2)题解报告A~E
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的更多相关文章
- CF Round #580(div2)题解报告
CF Round #580(div2)题解报告 T1 T2 水题,不管 T3 构造题,证明大约感性理解一下 我们想既然存在解 \(|a[n + i] - a[i]| = 1\) 这是必须要满足的 既然 ...
- Codeforces Educational Round 92 赛后解题报告(A-G)
Codeforces Educational Round 92 赛后解题报告 惨 huayucaiji 惨 A. LCM Problem 赛前:A题嘛,总归简单的咯 赛后:A题这种**题居然想了20m ...
- CF1169(div2)题解报告
CF1169(div2)题解报告 A 不管 B 首先可以证明,如果存在解 其中必定有一个数的出现次数大于等于\(\frac{m}{2}\) 暴力枚举所有出现次数大于等于$\frac{m}{2} $的数 ...
- Codeforces Round#320 Div2 解题报告
Codeforces Round#320 Div2 先做个标题党,骗骗访问量,结束后再来写咯. codeforces 579A Raising Bacteria codeforces 579B Fin ...
- Codeforces Round#704 Div2 题解(A,B,C,D,E)
FST ROUND !!1 A Three swimmers: 直接整除一下向上取整就好了: #include <bits/stdc++.h> using namespace std; t ...
- [CF]codeforces round 369(div2)
*明早起来再贴代码 A [题意] 给定n*5的方格 将横向的相邻两个变成+输出 [题解] ... B [题意] 一个n*n的正整数矩阵,有且仅有一个数为0 ,在这个位置填上一个数,使得每一列的和 每一 ...
- [CF]codeforces round#366(div2)滚粗记
开场心理活动:啊打完这场大概有1700了吧 中途心理活动:啊这个ABC看起来都随便做啊 死亡原因:欸怎么没网了 -75 .. A [题意]Hulk说完一句I hate会说that I love 然后是 ...
- CodeForces round 967 div2 题解(A~E)
本来准备比完赛就写题解的, 但是一拖拖了一星期, 唉 最后一题没搞懂怎么做,恳请大神指教 欢迎大家在评论区提问. A Mind the Gap 稳定版题面 https://cn.vjudge.net/ ...
- Codeforces Round #407 div2 题解【ABCDE】
Anastasia and pebbles 题意:你有两种框,每个框可以最多装k重量的物品,但是你每个框不能装不一样的物品.现在地面上有n个物品,问你最少多少次,可以把这n个物品全部装回去. 题解:其 ...
随机推荐
- 【2019年08月06日】A股最便宜的股票
查看更多A股最便宜的股票:androidinvest.com/CNValueTop/ 便宜指数 = PE + PB + 股息 + ROE,四因子等权,数值越大代表越低估. 本策略只是根据最新的数据来选 ...
- hystrixDashboard(服务监控)
1.新建项目 microservicecloud-consumer-hystrix-dashboard 2.yml文件 server: port: 9001 3.在pom.xml文件增加如下内容 &l ...
- (一)golang--初识go语言
学习来源:https://www.bilibili.com/video/av35928275/?p=1 尚硅谷的(我学spring.springmvc和mybatis就是他们的课) 使用1.9.2的 ...
- Unity Shader 屏幕后效果——景深
景深效果的原理是,在摄像机的近裁剪平面和远裁剪平面之间可以设置一个焦距,在这个距离所在的平面上的物体最为清晰,而这个距离之前或之后的物体成像是一种模糊状态(根据距离逐渐模糊,最终达到最为模糊的状态). ...
- Ansible17:Playbook之tags
目录 简介 为task打tag 使用tag 执行指定tag的task 排除指定tag的task 查看playbook中的所有tag 打tag的几种方式 ansible内置tag 简介 在大型项目当中, ...
- Linux : Ubuntu 安装 RabbitMQ
安装 Erlang: 手动编译(不推荐)http://www.erlang.org/downloads下载源码 如22版本:http://erlang.org/download/otp_src_22. ...
- 异步编程的类型系统:promise & future & closure & observable----异步编程类型的结构和操作
异步编程类型的结构和操作. 上下文维护. A promise represents the eventual result of an asynchronous operation. The prim ...
- 【04】Saltstack:配置管理
写在前面的话 当我们需要进行一系列可重复且复杂的操作的时候,如果还继续用传统的 cmd.run 来执行显然难以满足我们的需求.这时候就会在想一个问题,我们能不能把这些操作编辑成一个类似脚本的操作,我们 ...
- python输入一个字符串,输出翻转后的字符串(翻转字符串)
题目:输出一个字符串,输出翻转后的字符串.例如:输入字符串a123,输出321a. 方法一:使用列表的reverse方法 string=input('请输入一个字符串:') lst=list(stri ...
- asp.net webapi 随笔
第一次写博客,文笔有限,记录下学习的过程 话不多说,直接开干 首先用vs2017建立一个空网站项目,然后只勾选api 项目建立后,如下结构 其中WebApiConfig类配置了路由相关信息 publi ...