题解:AT_abc347_c [ABC347C] Ideal Holidays
抽象题。
思路
显然如果这些天在这么多周里肯定不行,把 序列中的每一个元素都对 取模。但是,如果出现 ,把它改成 。(好像不改也行?)
显然取完模后原序列不一定再有序了,所以排序,同时去重(方便计算)。设操作后的序列为 。
接着,我们枚举 ,则 天为该星期的第一天。那么 天就是离 最远的一天,只需算一下差值是否小于 即可。
细节:
- 可能 天是第一天, 天为最后一天。( 为去重后元素的个数)
- 差值一定要加 ,这样才是天数。有点像植树问题。
代码实现
#include<bits/stdc++.h>
using namespace std;
map<int,int>mp;
int n,cnt;
int f[200005],g[200005],a,b;
int main() {
cin>>n>>a>>b;
for(int i=1; i<=n; i++) {
cin>>f[i];
f[i]=f[i]%(a+b);
if(f[i]==0)f[i]=a+b;
mp[f[i]]++;
if(mp[f[i]]==1)g[++cnt]=f[i];
}
sort(g+1,g+cnt+1);
//1 9 10 11 1+a+b
//cout<<g[2]<<' '<<g[cnt+1]<<endl;
if((g[cnt]-g[1]+1)<=a){
cout<<"Yes"<<endl;
return 0;
}
else{
for(int i=2; i<=cnt; i++) {
if((g[i-1]+a+b-g[i]+1)<=a){
cout<<"Yes"<<endl;
return 0;
}
}
}
cout<<"No"<<endl;
return 0;
}
只错 个点怎么办?
只错 个点大概率是把 默认算为最后一天了。
对于这组样例:
2 3 12
1 14
可以以第 天为第一天,这样第 天就是休息日的最后一天,是可以的。

浙公网安备 33010602011771号