CF417B题解
CF417B题解
博客里使用更佳。
思路
简单的模拟,稍微的分析加上分类讨论就 AC 啦~
做法
首先,我们要用一个数组 \(a\) 来记录记录编号等于它下标的人发送了几个方案,然后就开始开心的模拟:每行输入一个 \(x\)(在与 \(A\) 相同的第一个程序之前发送的不同程序的数量),\(k\)(参赛者的编号,即程序的作者)。
然后就分为以下几种情况:
- \(x<a[k]\),就说明输入的方案数比记录的少,也就是说这次的方案与之前相同的方案中的其中一个相等,所以就不用做任何处理。
- \(x=a[k]\),说明这是一种新的情况,相应的 \(a[k]+1\)。
- \(x>a[k]\),也就是说输入的方案比记录的还多,不正确,此时可以直接输出 NO 结束程序。
分析就到此为止啦~
总结
- 简单的纯模拟
- 分析加分类讨论
代码
#include<iostream>
#include<cstdio>
#include<algorithm>
using namespace std;
int a[1000005],n;
//a数组来记录编号等于它下标的人发送了几个方案。
int main(){
scanf("%d",&n);
for(int i=1; i<=n; i++){
int x,k;
scanf("%d %d",&x,&k);
if(x==a[k]) a[k]++;//有一个情况和记录的a[k]相等,说明这是一种新的情况,a[k]++
else if(x>a[k]){//如果x大于a[k],也就是说输入的方案比记录的还多,不正确。
printf("NO");
return 0;//直接结束程序。
}
//else if(x<a[k]) 这种情况不做处理。
}
printf("YES");//要是要输出NO,前面已经结束程序,能撑过前面的循环就表明数据是按照顺序输入的。
return 0;
}
//完结撒花✿✿ヽ(°▽°)ノ✿。

浙公网安备 33010602011771号