牛牛想起飞

牛牛想起飞

https://ac.nowcoder.com/acm/contest/9854/B

牛牛想起飞
用bitset来记录可以得到的数,然后求得值为1的最高位就是答案

#include <bits/stdc++.h>
using namespace std;
#define Happy return
#define New_Year 0
const int N = 1e5+5;
int a[N],b[N];
bitset<105> bt,z,x;
int main()
{
    int n,y;
    cin>>n>>y;
    int sum=0;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum=(sum+a[i])%y;
    }
    bt[sum]=1;
    for(int i=1;i<=n;i++)
    {
        cin>>b[i];
        b[i]%=y;
    }

    for(int i=1;i<=n;i++)//枚举序列b中的每一个数
    {
        //加上b[i]
        {
            x = bt<<b[i];
            z = bt>>(y-b[i]);
            x|=z;
            bt|=x;

        }
        //减去b[i]
        {
            x=bt>>b[i];
            z = bt<<(y-b[i]);
            x|=z;
            bt|=x;
        }
    }
    for(int i=y-1;i>=0;i--)//因为是模y意义下的最大值,所以从y-1位开始枚举找值为1的最高位
    {
        if(bt[i]){
            cout<<i<<endl;
            Happy New_Year;
        }
    }
}
全部评论

相关推荐

07-09 18:28
门头沟学院 Java
写着提前批,结果还要实习4个月以上???
程序员牛肉:这种不用看,直接投了,面试的时候问对应的HR就行。有可能他们是直接复制的暑期实习的模板。
点赞 评论 收藏
分享
评论
2
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务