【题目描述】
温老师为了带小朋友们巩固小学数学知识,特地设计了一个报数游戏。 小朋友们在n
块空地上玩报数游戏,遵循如下规则
-
每个小朋友手里都有一个写了数字的纸条,在报数的时候需要将纸条上的数字报出来
-
报数最小的小朋友们离开场地
-
每个小朋友都会做数学计算,在一轮游戏报数最小的小朋友们离场之后,剩余的所有小朋友会将手里的纸条上的数字减去刚刚离场的小朋友们纸条上的数字。并作为新的报数的数字。
这个游戏一直持续到所有小朋友都离场才会结束,现在请你输出最多可以进行报数游戏的轮次。
【输入格式】
一共两行,第一行有一个整数,表示空地的数量 第二行有使用空格分隔的n个整数,非0整数表示当前这块地上小朋友纸条上的初始数字,0表示当前地块上没有小朋友
【输出格式】
一共一行,一个整数,表示游戏最多可以进行的轮次
【样例输入1】
5 1 5 0 3 5
【样例输出1】
3
【样例解释1】
第一轮游戏:选出 student[1] = 1的小朋友离场 ,之后 students = [0,4,0,2,4] 。 第二轮游戏:选出 student[4] = 2的小朋友离场 ,之后 students = [0,2,0,0,2] 。 第三轮游戏:选出 student[2] = 2的小朋友离场 ,之后 students = [0,0,0,0,0] 。
【数据范围】
1 <= students.length <= 1e6 0 <= students[i] <= 1e18
先按着题意走,确定思路。
首先要求按顺序出局,第一次想到贪心,但发现1e6的范围会超时。
找一下规律,得出:若有人的值和其他人一样,那么在第一个人报数时,其他人也会同时出局(因为被减为0了),所以本题实际上是统计数字的题目。
AC代码如下
#include<bits/stdc++.h>
using namespace std;
map<long long, bool> mpp;
long long ans = 0;
int main(){
int n;
cin >> n;
mpp[0] = 1;
for (int i = 1; i <= n;i++){
long long t;
cin >> t;
if(!mpp[t]){
ans++;
mpp[t] = 1;
}
}
cout << ans;
}