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;
    }
}

 

posted @ 2021-03-13 20:50  Endeavo_r  阅读(69)  评论(0)    收藏  举报