Codeforces Round 882 (Div. 2)

目录

[A. The Man who became a God](#A. The Man who became a God)

题目分析:

[B. Hamon Odyssey](#B. Hamon Odyssey)

题目分析:

[C. Vampiric Powers, anyone?](#C. Vampiric Powers, anyone?)

题目分析:


A. The Man who became a God

题目分析:

n个人分成k组,每一组的力量都是这样的,那么如果分成k组那么就会有k-1个力量不被统计,将力量总和减去前k-1个最大的力量就是最小的结果

cpp 复制代码
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define INF 0x3f3f3f3f
#define IOS ios::sync_with_stdio(false);cin.tie(0);
#define int long long
#define pb push_back
#define vct vector
#define checkbit __builtin_popcount
#define gcd __gcd
#define use int T;cin>>T;while(T--)
template<class T> bool mmax(T &u, T v) { return u < v ? (u = v, 1) : 0; }
template<class T> bool mmin(T &u, T v) { return u > v ? (u = v, 1) : 0; }
#define lowbit(x) (x&(-x))
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
using namespace std;
typedef pair<int,int>pii;
const int N =105;
int a[N],sb[N];
bool cmp(int a,int b){
    return a>b;
}
signed main()
{IOS
use{
    int n,k;cin>>n>>k;cin>>a[1];
    for(int i=2;i<=n;i++){
        cin>>a[i];
        
        sb[i-1]=abs(a[i]-a[i-1]);
    }
    sort(sb+1,sb+n,cmp);int sum=0;
    for(int i=k;i<n;i++){
        sum+=sb[i];
    }cout<<sum<<endl;
}

return 0;
}

B. Hamon Odyssey

题目分析:

将数组分组,每个组内进行按位与运算,若想让每个组的结果加和最小,最多可以分几个组

按位与运算,是一个单调递减的过程,如果一个数字的某一位为0,那么无论多少数该位为1 ,结果都为0,对于题目来说,我们需要尽可能的将一个组的结果变为零,也即让所有的0尽可能的发挥作用,故,如果当前数按位与为零之后,将其分为一组.

cpp 复制代码
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define INF 0x3f3f3f3f
#define IOS ios::sync_with_stdio(false);cin.tie(0);
#define int long long
#define pb push_back
#define vct vector
#define checkbit __builtin_popcount
#define gcd __gcd
#define use int T;cin>>T;while(T--)
template<class T> bool mmax(T &u, T v) { return u < v ? (u = v, 1) : 0; }
template<class T> bool mmin(T &u, T v) { return u > v ? (u = v, 1) : 0; }
#define lowbit(x) (x&(-x))
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
using namespace std;
typedef pair<int,int>pii;
const int N =2e5+7;
signed main()
{IOS
use{
    int fi=0,ans=0,x,n;cin>>n;
    for(int i=1;i<=n;i++){
        cin>>x;
        if(fi==0)fi=x,ans++;
        fi&=x;
    }
    if(!fi)ans++;
    cout<<max(1ll,ans-1)<<endl;
}

return 0;
}

C. Vampiric Powers, anyone?

题目分析:

给一个数组,可以在数组的末尾加上从~的异或和,求出数组最大的数可能是多少。

已知可以将~的异或和(qwq)提取出来,那么从1~-1的异或和(awa)就可以通过AllXOR^qwq=awa;

我们可以利用前缀和的思想,存下前项的异或和,我们可以通过XOR前面的异或和来获得各个小区间的异或和,最终遍历取最大值即可;

cpp 复制代码
#include<bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define INF 0x3f3f3f3f
#define IOS ios::sync_with_stdio(false);cin.tie(0);
#define int long long
#define pb push_back
#define vct vector
#define checkbit __builtin_popcount
#define gcd __gcd
#define use int T;cin>>T;while(T--)
#define LEN length()
#define all(a) a.begin(),a.end()
template<class T> bool mmax(T &u, T v) { return u < v ? (u = v, 1) : 0; }
template<class T> bool mmin(T &u, T v) { return u > v ? (u = v, 1) : 0; }
#define lowbit(x) (x&(-x))
#define yes cout<<"YES"<<endl
#define no cout<<"NO"<<endl
using namespace std;
typedef pair<int,int>pii;
signed main()
{IOS
use{
   int n;cin>>n;
		vector<int> a(n+1);
		for(int i=1;i<=n;i++)
		{
			cin>>a[i];
			a[i]^=a[i-1];
		}
		vct<bool>st((1<<8|1),0);
		st[0]=1;
		int ans=0;
		for(int i=1;i<=n;i++)
		{
			for(int j=0;j<(1<<8);j++)
			{
				if(st[j]) ans=max(ans,j^a[i]);
			}
			st[a[i]]=1;
		}
		cout<<ans<<endl;

    
}
return 0;
}
相关推荐
故事和你918 小时前
洛谷-数据结构1-1-线性表1
开发语言·数据结构·c++·算法·leetcode·动态规划·图论
脱氧核糖核酸__8 小时前
LeetCode热题100——53.最大子数组和(题解+答案+要点)
数据结构·c++·算法·leetcode
脱氧核糖核酸__9 小时前
LeetCode 热题100——42.接雨水(题目+题解+答案)
数据结构·c++·算法·leetcode
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:数列分段 Section I
c++·算法·编程·贪心·csp·信奥赛·线性扫描贪心
王老师青少年编程10 小时前
csp信奥赛C++高频考点专项训练之贪心算法 --【线性扫描贪心】:分糖果
c++·算法·贪心算法·csp·信奥赛·线性扫描贪心·分糖果
leaves falling10 小时前
C++模板进阶
开发语言·c++
无敌昊哥战神11 小时前
【保姆级题解】力扣17. 电话号码的字母组合 (回溯算法经典入门) | Python/C/C++多语言详解
c语言·c++·python·算法·leetcode
脱氧核糖核酸__11 小时前
LeetCode热题100——238.除了自身以外数组的乘积(题目+题解+答案)
数据结构·c++·算法·leetcode
ouliten11 小时前
C++笔记:std::invoke
c++·笔记
j_xxx404_12 小时前
C++算法:哈希表(简介|两数之和|判断是否互为字符重排)
数据结构·c++·算法·leetcode·蓝桥杯·力扣·散列表