魔法卷轴
题目链接:https://ac.nowcoder.com/acm/contest/107879/E
题意:
有n个关键时间,两种操作:1.延后一个关键时间1s 2.提前一个关键时间1s
是否能在不超过其时间的情况下将所有关键时间操作两次
思路:
容易知道当存在某一个时间点使得有两个关键时间重复了是肯定无解的
为了避免这一情况,我们尽量想让关键时间不重复且延后
所以从后往前(方便将较远的时间点往前调整),贪心地为每一个关键时间选择第一次使用哪一种操作
接着从前往后枚举时间点。我们需要看剩余可利用的时间是否满足小于等于关键时间,因为已经选择了每一个关键时间的第一次操作,所以每次剩余时间都要-2
void solve(){
int n;cin>>n;
vector<int>a(n+1);
rep(i,1,n){
cin>>a[i];
}
sort(a.begin()+1,a.end());
map<int,int>mp;
for(int i=n;i>=1;i--){
int x=a[i]+1;
int y=a[i]-1;
if(!mp.count(x))mp[x]=1;
else if(!mp.count(y))mp[y]=1;
else {
cout<<"NO"<<endl;return;
}
}
int s=0,now=0;
for(auto [x,y]:mp){
s+=x-now;
now=x;
s-=2;
if(s<0){
cout<<"NO"<<endl;return;
}
}
cout<<"YES"<<endl;
}