2021年度训练联盟热身训练赛第一场
D.Some Sum
题意:从1到100选n个连续的正整数,判断它们的和是偶数还是奇数。如果是偶数输出“Even”,如果是奇数输出“Odd”,如果可能是偶数也可能是奇数将输出“Either”
题解:如果n是奇数,则这n个数中奇数比偶数多一个,或者偶数比奇数多一个,则最后的结果可能是偶数也可能是奇数。如果n是偶数,那么这n个数中奇数的个数与偶数的个数相等;如果有奇数个奇数,最后的结果为奇数,如果有偶数个奇数则最后结果为偶数。
#include<algorithm> #include<iostream> #include<cstdio> #include<cstring> #include<string> #include<cmath> #include<set> using namespace std; typedef long long ll; int main(){ int n; cin>>n; if(n&1){ cout<<"Either"<<endl; }else{ if((n/2)&1){ cout<<"Odd"<<endl; }else{ cout<<"Even"<<endl; } } return 0; }
F.Pulling Their Weight
题意:给m和m个动物的体重,将这m个动物分成两组,将体重大于t的动物放在一组,将体重小于t的动物放在一组,最终使两组动物的体重相等。寻找满足条件的最小的t;如果有些动物的重量正好等于t,如果这类动物的数量是偶数个,将他们平均分到两组;如果是奇数个其中一只动物就会派去和精灵工作。(t一定存在)
题解:将这个m个数从小到大排序并求其前缀和;通过前缀和求是否有满足条件的t
#include<algorithm> #include<iostream> #include<cstring> #include<string> #include<cmath> #include<map> using namespace std; #define MAXN 100010 typedef long long ll; ll a[MAXN],sum[MAXN]; int main(){ int m; cin>>m; int ans=0; for(int i=0;i<m;i++){ cin>>a[i]; } sort(a,a+m); for(int i=0;i<m;i++){ sum[i]=sum[i-1]+a[i]; } int t; for(int i=0;i<m;i++){ if(sum[i]==sum[m-1]-sum[i]){ t=a[i]; if(a[i]==a[i+1]){ t=a[i]; }else{ t++; } break; } if(sum[i]==sum[m-1]-sum[i+1]){ t=a[i+1]; break; } } cout<<t<<endl; return 0; }
H.On Average They're Purple
题意:Alice 上色,Bob可以选择一条路从1到n;Bob他可以选择任意一条路,要求减少 "colorchange" 的次数;而 Alice 希望 "colorchange"的次数尽量大。求Alice 上色之后,Bob 从1 到 n 最少的颜色改变次数。
题解:最短路-1
#include<algorithm> #include<iostream> #include<cstring> #include<string> #include<queue> #include<vector> #include<cstdio> using namespace std; typedef long long ll; #define MAXN 100010 vector<int>a[MAXN]; int vis[MAXN]; int main(){ int n,m; cin>>n>>m; int u,v; for(int i=1;i<=m;i++){ cin>>u>>v; a[u].push_back(v); a[v].push_back(u); } vis[1]=1; queue<int>q; q.push(1); while(q.size()){ int t=q.front();//返回第一个元素的引用 q.pop(); for(int i:a[t]){ if(!vis[i]){ vis[i]=vis[t]+1; q.push(i); } } /* for(int i=0;i<a[t].size();i++){ if(!vis[a[t][i]]){ vis[a[t][i]]=vis[t]+1; q.push(a[t][i]); } } */ } cout<<vis[n]-2<<endl; return 0; }
J.Pulling Their Weight
题意:有一个n x n的网格,判断其是否满足 行列黑白格子数量相等且行列中没有连续的三个同色格子;满足输出1不满足输出0
题解:模拟
#include<algorithm> #include<iostream> #include<cstring> #include<cstring> #include<cmath> using namespace std; int main(){ int n; cin>>n; int w1=0,b1=0,w2=0,b2=0; int flag1=0,flag2=0; char s[25][25]; for(int i=0;i<n;i++){ for(int j=0;j<n;j++){ cin>>s[i][j]; } } for(int i=0;i<n;i++){ b1=0,w1=0,b2=0,w2=0; for(int j=0;j<n;j++){ if(s[i][j]=='B'){ b1++; } if(s[i][j]=='W'){ w1++; } if(s[j][i]=='B'){ b2++; } if(s[j][i]=='W'){ w2++; } if((s[i][j]==s[i][j+1]&&s[i][j+1]==s[i][j+2])||(s[j][i]==s[j+1][i]&&s[j+1][i]==s[j+2][i])&&j+2<=n){ flag2=1; } } if(b1!=w1||b2!=w2){ flag1=1; } } if(!flag1&&!flag2){ cout<<1<<endl; }else{ cout<<0<<endl; } }

浙公网安备 33010602011771号