Codeforces Round 1068 (Div. 2)

B

思考时间30分钟,一开始考虑是不是一个数学转化问题,k-ai,或者-(k-bi) 都是k减去这个值,下边的有负号而已,

后面想到不太行,考虑是不是DP,因为当前的状态只能是上一个来,然后观察到这个Ki 最大的话有两种可能

Max( Ki-1(max)-ai, bi-Ki-1(min) )  从而得知只要保留K(min),K(max)就可以

void solve(){
    int n;cin>>n;
    vector<int>a(n+1),b(n+1),mn(n+1,0),mx(n+1,0);
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=n;i++)cin>>b[i];
    for(int i=1;i<=n;i++){
        mn[i]=min(mn[i-1]-a[i],b[i]-mx[i-1]);
        mx[i]=max(mx[i-1]-a[i],b[i]-mn[i-1]);
    }
    cout<<mx[n]<<endl;
    return ;
}

C

还是一如既往的费劲,一开始在思考数据范围,一直想不到好的处理方式,因为如果x=1,要一直算倍数的话时间复杂度就要到了O(1e9),所以一直没有构思好如何去做

然后突发奇想是不是一个存在的质数找不到他的倍数的时候就代表着这一系列的数字无法满足就要输出-1退出

2 6 8这样的组合,一旦2遍历到 4不存在就结束

然后这样的时间复杂度可以到O(N+N)

void solve(){
    int n,k;cin>>n>>k;
    vector<int>sh(n);
    map<int,int>mp,op;
    for(auto &it:sh){
        cin>>it;
        mp[it]++;
    }
    sort(all(sh));
    sh.erase(unique(all(sh)),sh.end());
    set<int>ans;
    for(auto it:sh){
        int f=1;
        if(op[it])continue;
        for(int j=it;j<=k;j+=it){
            if(mp[j]==0){
                cout<<-1<<endl;
                return;
            }else{
                op[j]=1;
            }
        }
        if(f)ans.insert(it);
    }
    cout<<ans.size()<<endl;
    for(auto it:ans)cout<<it<<" ";
    cout<<endl;
    return ;
}

D(待补)

 

posted @ 2025-12-07 01:22  zhzhzhao  阅读(98)  评论(0)    收藏  举报