题解 P3131 [USACO16JAN]Subsequences Summing to Sevens S
这道题我先用了最朴素的前缀和:
#include<iostream>
using namespace std;
int a[50000+10];
long long num[50000+10];
int main()
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
num[i] = num[i-1]+a[i];
}
for(int i = n; i >= 0; i--)
{
long long cnt = 0;
for(int j = i; j <= n; j++)
{
cnt = num[j] - num[j-i];
if(cnt % 7 == 0)
{
cout<<i;
return 0;
}
}
}
return 0;
}
代码原理其他人都讲清楚了,但我并没有一开始就模7,所以超时了。 这时,我灵机一动,加了个二分答案优化:
#include<iostream>
using namespace std;
int a[50000+10];
long long num[50000+10];
int main()
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>a[i];
num[i] = num[i-1]+a[i];
}
// for(int i = n; i >= 0; i--)
// {
// long long cnt = 0;
// for(int j = i; j <= n; j++)
// {
// cnt = num[j] - num[j-i];
// if(cnt % 7 == 0)
// {
// cout<<i;
// return 0;
// }
// }
// }
int l = 1, r = n;
while(r >= l)
{
bool flag = true;
int mid = (r+l)>>1;
long long cnt = 0;
for(int j = mid; j <= n; j++)
{
cnt = num[j] - num[j-mid];
if(cnt % 7 == 0)
{
l = mid + 1;
flag = false;
break;
}
}
if(flag)
{
r = mid - 1;
}
}
cout<<r<<endl;
return 0;
}
就过了!