CF417B题解

CF417B题解

博客里使用更佳。

思路

简单的模拟,稍微的分析加上分类讨论就 AC 啦~

做法

首先,我们要用一个数组 \(a\) 来记录记录编号等于它下标的人发送了几个方案,然后就开始开心的模拟:每行输入一个 \(x\)(在与 \(A\) 相同的第一个程序之前发送的不同程序的数量),\(k\)(参赛者的编号,即程序的作者)。

然后就分为以下几种情况:

  1. \(x<a[k]\),就说明输入的方案数比记录的少,也就是说这次的方案与之前相同的方案中的其中一个相等,所以就不用做任何处理。
  2. \(x=a[k]\),说明这是一种新的情况,相应的 \(a[k]+1\)
  3. \(x>a[k]\),也就是说输入的方案比记录的还多,不正确,此时可以直接输出 NO 结束程序。

分析就到此为止啦~

总结

  1. 简单的纯模拟
  2. 分析加分类讨论

代码

#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; 
} 
//完结撒花✿✿ヽ(°▽°)ノ✿。
posted @ 2025-01-29 15:25  naroto2022  阅读(12)  评论(0)    收藏  举报