Codeforces Round 1065 (Div. 3)
A. Shizuku Hoshikawa and Farm Legs
https://codeforces.com/contest/2171/problem/A
这个稍微动一下脑子的送分题,看看脑子零不灵活罢了,鸡和牛各有总共有多少种分配方案,其实这就等于牛可以放的头数(OvO)对吧。
所以ans=总数/4 +1(其实还是要思考一下的),判断一下列外情况
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
using namespace std;
void solve(){
int n;
cin>>n;
if(n%2!=0){
cout<<0<<"\n";
return ;
}else{
int ans=1;
ans+=n/4;
cout<<ans<<"\n";
return ;
}
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
B. Yuu Koito and Minimum Absolute Sum
https://codeforces.com/contest/2171/problem/B
这个题还是要思考一下的(对我来说QwQ),就是在一个数列中元素等于-1的地方进行替换,使得整个数列相邻数对差的和的绝对值最小即可,当然有一个关键观察1:数对差是后面元素减前面元素,然后我们独自思考一下就会发现第二个关键观察:除了数列第一个元素和最后一个元素进行变动才会影响最终答案,中间的元素无论如何变动都会被抵消:An+1-An+An-An-An-1->An+1-An-1,所以,为了减少在计算过程中产生影响,不妨将-1的位置全变成0进行计算,进行计算一下,会发现还有一个关键地方如果总和小于0,那么最后一个位置-1时才可以改变,总和大于0时,第一个元素为-1才可以改变,那么解题思路就清晰了,全换成0,计算一下,如果总和大于0那么判断第一个位置是否为-1,是就将第一个位置换为总和,小于0如上,代码:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int> a(n);
vector<int> b;
long long sum=0;
for(int i=0;i<n;i++){
cin>>a[i];
if(a[i]==-1){
a[i]=0;
b.push_back(i);
}
if(i>0) sum+=a[i]-a[i-1];
}
if(sum==0){
cout<<sum<<"\n";
for(auto &it:a){
cout<<it<<" ";
}
cout<<"\n";
}else{
if(!b.empty()&&sum>0&&b.front()==0){
cout<<0<<"\n";
a[0]=sum;
for(auto &it:a){
cout<<it<<" ";
}
cout<<"\n";
}else if(!b.empty()&&sum<0&&b.back()==a.size()-1){
cout<<0<<"\n";
a.back()=-1*sum;
for(auto it:a){
cout<<it<<" ";
}
cout<<"\n";
}else{
cout<<abs(sum)<<"\n";
for(auto it:a){
cout<<it<<" ";
}
cout<<"\n";
}
}
return;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C1. Renako Amaori and XOR Game (easy version)
https://codeforces.com/contest/2171/problem/C1
这个题是一个博弈论的题,其实很简单,但是我想的非常麻烦,不断分类讨论,一直Wa,这个其实就是看看谁有最终决策就会胜利,都有或者都没有就会平局,那么具体分析一下为什么会有这种结论,首先,能交换的位置并且交换后会产生影响的只有二者该位置元素不同的位置,那么,我们再来回顾一下异或的性质:0异或上任何数都等于任何数本身,任何数异或上自己都是0,而二者异或和只有0或1,那么就看异或和是否为1就可以了,而最终结果是否为1,只在于1的个数的奇偶,进行一次交换,那么二者1的个数奇偶性一定会同时发生改变,影响最终答案,那么就可以总结一下最终思路了,如果不进行任何改变二者的异或和相同,那么直接平局就可以了,否者就判断谁有最终决策的能力就可以了,代码如下:
#include<iostream>
#include<vector>
#include<string>
#include<algorithm>
#include<cmath>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int> a(n);
vector<int> b(n);
int a1=0,b1=0;
for(auto &it:a){
cin>>it;
a1^=it;
}
vector<int> num1;
vector<int> num2;
for(int i=0;i<n;i++){
cin>>b[i];
b1^=b[i];
}
int ans=-1;
for(int i=n-1;i>=0;i--){
if(a[i]!=b[i]){
ans=i;
break;
}
}
if(ans==-1){
cout<<"Tie\n";
}else if(a1==b1){
cout<<"Tie\n";
}else{
if((ans+1)%2==0){
cout<<"Mai\n";
}else if((ans+1)%2==1){
cout<<"Ajisai\n";
}}
return;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
C2. Renako Amaori and XOR Game (hard version)
https://codeforces.com/contest/2171/problem/C2
这种题第一次见还是很没有头绪的,但是学过了后就会发现其实很简单,要不然才1300分,那么就先来说一下吧,先总的异或起来,看看最高位1出现的位置,然后判断1的位置谁占据就可以了,有最高决定权




#include<bits/stdc++.h>
using namespace std;
void solve(){
int n;
cin>>n;
vector<int> a(n),b(n);
int A=0,B=0;
for(auto &it:a){
cin>>it;
A^=it;
}
for(auto &it:b){
cin>>it;
B^=it;
}
if((A^B)==0){
cout<<"Tie\n";
return ;
}else{
int T=A^B;
int k0=0;
while(T>>k0){
k0++;
}
k0--;//偏差修复
for(int i=n-1;i>=0;i--){
if((a[i]&(1<<k0))!=(b[i]&(1<<k0))){//优先级注意
int turn =i+1;
if(turn%2!=0){//胜负判断
cout<<"Ajisai\n";
}else{
cout<<"Mai\n";
}
return;
}
}
}
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(nullptr);
int t;
cin>>t;
while(t--){
solve();
}
return 0;
}
浙公网安备 33010602011771号