题目大意:给出一个数列和一个数字k,如果这个数列中有数字k的话,就把数列中的所有数-1,重复这个操作,直到数列中没有数字k。
思路:
一开始是想着用模拟做的,一直循环-1,直到没有为止。。但是一看数列长度10^6,数字大小10 ^9,这样做肯定TLE;然后队友大佬给指了路,如果能一直减的话,这个数列中一定有从k开始连续的数,一共有多少连续的数,就能够减掉多少!
(因为,第一次减1肯定会有k的,那么,如果能减两次就得有k+1了,如果能减3次就得有k+2…)
之后,就可以将出现的数标记下来。然而,问题来了,数的最大可以到10^9,怎么能开一个10 ^9的数组呢?当然是不能的,得用map容器。
code:
#include<iostream>
#include<map>
using namespace std;
const int N=1000010;
int n,k,x,a[N],cnt;
map<int,int> mp;
int main(){
cin>>n>>k;
for(int i=1;i<=n;i++) cin>>a[i],mp[a[i]]++;
for(int i=k;;i++){
if(mp[i]) cnt++;
else break;
}
for(int i=1;i<=n;i++){
if(a[i]-cnt>=0) cout<<a[i]-cnt;
else cout<<0;
cout<<" ";
}
return 0;
}