[ABC384D] Repeated Sequence 题解

题目大意

给你一个周期为 n n n 的无穷序列 a = ( a 1 , a 2 , a 3 , …   ) a=(a _ 1,a _ 2,a _ 3,\dotsc) a=(a1,a2,a3,) 的前 a a a a 1 , a 2 , … , a N a _ 1,a _ 2,\dotsc,a _ N a1,a2,,aN

请判断该无穷序列是否存在和为 s s s 的非空连续子序列。

题目做法

这道题目中的 s s s 并不是要直接建一个无穷序列暴力算出来,而是我们可以想到能装下一个循环的段落就可以不用考虑了,只需求出多余的序列的部分就行了。

求出多余的序列的部分又可以直接变成维护左右两个指针就可以了。如果区间和比目标值大,那就左指针加 1 1 1 。如果区间和比目标值小,那就右指针加 1 1 1 。如果相等就输出 Yes就可以了。

AC代码

#include<bits/stdc++.h>
#define int long long
using namespace std;
int n,s,s1,s2,l,r,p,a[5000005];
main(){
	cin>>n>>s;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		a[i+n]=a[i]; //把数组复制一份到后面 
		s1+=a[i]; //计算一个周期的和 
	}
	s2=s/s1; //有多少段周期
	s=s-(s2*s1); //算出要算的 
	l=1;
	r=1;
	p=a[1]; 
	while(l<=n&&r<=n*2){
		if(p>s){
			//如果区间和比目标值大,那就左指针加 1。
			p-=a[l];
			l++;
		}else if(p<s){
			//如果区间和比目标值小,那就右指针加 1。
			r++;
			p+=a[r];
		}
		if(p==s){
			//找到相等的直接推出。 
			puts("Yes");
			exit(0);
		}
	}
	puts("No");
	return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值