题解 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;
} 

就过了!

posted @ 2020-10-25 09:51  WRuperD  阅读(2)  评论(0编辑  收藏  举报  来源

本文作者:DIVMonster

本文链接:https://www.cnblogs.com/guangzan/p/12886111.html

版权声明:本作品采用知识共享署名-非商业性使用-禁止演绎 2.5 中国大陆许可协议进行许可。

这是一条自定义内容

这是一条自定义内容