题解:AT_abc347_c [ABC347C] Ideal Holidays

抽象题。

思路

显然如果这些天在这么多周里肯定不行,把 DD 序列中的每一个元素都对 a+ba+b 取模。但是,如果出现 00,把它改成 a+ba+b。(好像不改也行?)

显然取完模后原序列不一定再有序了,所以排序,同时去重(方便计算)。设操作后的序列为 gg

接着,我们枚举 ii,则 gig_i 天为该星期的第一天。那么 gi1g_{i-1} 天就是离 ii 最远的一天,只需算一下差值是否小于 aa 即可。

细节:

  • 可能 g1g_1 天是第一天,gcntg_{cnt} 天为最后一天。(cntcnt 为去重后元素的个数)
  • 差值一定要加 11,这样才是天数。有点像植树问题。

代码实现

#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;
}

只错 11 个点怎么办?

只错 11 个点大概率是把 gcntg_{cnt} 默认算为最后一天了。

对于这组样例:

2 3 12
1 14

可以以第 1414 天为第一天,这样第 11 天就是休息日的最后一天,是可以的。

posted @   Weslie_qwq  阅读(9)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· 没有Manus邀请码?试试免邀请码的MGX或者开源的OpenManus吧
点击右上角即可分享
微信分享提示