随笔 - 72,  文章 - 2,  评论 - 0,  阅读 - 1258

A. The Man who became a God

题意:将一个数组划分为k部分,使得每个部分的相邻数字的差值的绝对值之和的和最小是多少

思路:按照差值排个序,将差值最大的k个删除,即可

代码:

#include<bits/stdc++.h>
using namespace std;
void solve(){
    int n,k;
    cin>>n>>k;
    k--;
    vector<int>ans;
    vector<int>q(n);
    for(int i=0;i<n;i++){
        cin>>q[i];
    }
    for (int i = 1; i <n ; ++i) {
        ans.push_back(abs(q[i]-q[i-1]));
    }
    sort(ans.begin(),ans.end(),greater<int>());
    for (int i = 0; i <ans.size()&&k!=0 ; ++i,k--) {
        ans[i]=0;
    }
    int res=0;
    for (int i = 0; i < ans.size(); ++i) {
        res+=ans[i];
    }
    cout<<res<<endl;

}
int main(){
    int t;
    cin>>t;
    while(t--){
        solve();
    }
}

B. Hamon Odyssey

题意:一个数组的数据,f[l,r]是指al到ar的&和,问保证和最小的情况下,数组最多能分成几段

思路:易证,分成一段时,&的和最小,且最小值是>=0,当f[1,n]是非0,任意区间的f函数值是>=f[1,n]的,那么我们可以从1开始遍历,即找每一段的函数值为0,分成多少段,可知当前面是0时,下一个数字放到下一个区间是优于加到目前的区间的,因为放到当前区间首先无影响,但加到下一个区间是有可能使下一个区间的值更小,因此我们找可以分成几个0区间即可,如果没有0的区间,那么就分成1到n这一段

代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+5;
void solve(){
    int n;
    cin>>n;
    vector<int>q(n+2);
    for (int i = 1; i <=n ; ++i) {
        cin>>q[i];
    }
    int sum=0;
    int res=0;
    sum=q[1];
    for (int i = 1; i <=n ; ++i) {
        sum&=q[i];
        if(sum==0){
            res++;
            sum=q[i+1];
        }
    }
    cout<<max(1,res)<<endl;

}
int main(){
    int t;
    cin>>t;
    while (t--){
        solve();
    }

}

C. Vampiric Powers, anyone?

题意:

给定一个数组,如a b c d 选择任意一个区间,做异或和,得到e放入结尾,无限次操作,问可得到的最大数是多少,我们可以知道新生成的数字是由原数组abcd异或得来的,如果我们用新形成的数字做异或和获得新数字,abcd efgh是新数组,我们对fgh异或和为x,defgh异或和为y ,x^y就等于d^e,由此可知我们所加的数字是原数组任意区间的异或和。

  • 由此我们得到结论,此题是在所有子区间内,输出最大区间的异或和。
  • 暴力枚举的话,会超时,但我们可以发现数据范围在256之内,我们求一遍前缀异或和,如何再两层for循环,即可求出我们能得到的最大的区间异或和

    代码:

    #include<bits/stdc++.h>
    using namespace std;
    #define int long long
    #define  PII pair<int,int>
    void solve(){
    int n;
    cin>>n;
    vector<int>q(n+1);
    
    set<int>st;
    st.insert(0);
    for (int i = 1; i <=n ; ++i) {
        cin>>q[i];
        q[i]=q[i]^q[i-1];
        st.insert(q[i]);
    }
    int ans=0;
    for (auto i:st) {
        for (auto j:st) {
            ans=max(i^j,ans);
        }
    }
    cout<<ans<<endl;
    }
    signed main(){
    ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr);
    int t=1;
    cin>>t;
    while (t--){
        solve();
    }
    }
posted on   IR101  阅读(4)  评论(0编辑  收藏  举报  
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示