1. 程式人生 > >Educational Codeforces Round 56 (Rated for Div. 2) ABCD

Educational Codeforces Round 56 (Rated for Div. 2) ABCD

題目連結https://codeforces.com/contest/1093

A. Dice Rolling

題意:

有一個號數為2-7的骰子,現在有一個人他想扔到幾就能扔到幾,現在問需要扔多少次,能使扔出的總和等於xi。

 

題解:

由於是special judge,模擬一下搞搞就行了= =

 

程式碼如下:

#include <bits/stdc++.h>
using namespace std;

int main(){
    int t;
    cin>>t;
    int n;
    while
(t--){ cin>>n; for(int i=2;i<=7;i++){ if(n%i!=1){ cout<<n/i+(n%i!=0)<<endl; break ; } } } return 0; }
View Code

 

B. Letters Rearranging

題意:

給出一個字串,現在你可以任意交換字元位置,然後輸出一種非迴文串的方案,如果沒有這樣一種方案,輸出-1。

 

題解:

注意迴文串的性質,那麼我們首先判斷一下所有字元是否相同,如若相同直接輸出-1。否則排個序就好了~

 

程式碼如下:

#include <bits/stdc++.h>
using namespace std;
int t;
const int N = 1005;
char s[N];
int main(){
    cin>>t;
    while(t--){
        scanf("%s",s);
        int flag = 1;
        int len  =strlen(s);
        s[len]
=s[0]; for(int i=1;i<=len;i++){ if(s[i]!=s[0]) flag=0; } if(flag) cout<<-1<<endl; else{ sort(s,s+len); for(int i=0;i<len;i++) cout<<s[i]; cout<<endl; } } return 0; }
View Code

 

C. Mishka and the Last Exam

題意:

一共有n個數,現在給出b1,b2....bn/2,滿足bi=ai+an-i+1。

現在要你構造出合法的a1....an,並且a1<=a2<=...<=an,保證輸入有解。

 

題解:

對於b1=a1+an來說,我們讓a1=0,a2=b1是最好的,這樣可以讓左右端點最大。

對於後面的每個bi,我們令d=bi-bi-1,那麼如若d>0,我們可以想,假若a2,an-1不變,那麼他們之和是小於b2的,所以我們就讓左端點變大(貪心策略)。

對於d=0或者d<=0都可以同樣的策略去想(因為題目保證輸入有解)。

 

程式碼如下:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 4e5+5;
int n;
ll a[N],b[N];
int main(){
    cin>>n;
    for(int i=1;i<=n/2;i++) cin>>b[i];
    a[1]=0;a[n]=b[1];
    for(int i=2;i<=n/2;i++){
        ll d = b[i]-b[i-1];
        if(d>=0) a[i]=d+a[i-1],a[n-i+1]=a[n-i+2];
        else a[i]=a[i-1],a[n-i+1]=a[n-i+2]+d;
    }
    for(int i=1;i<=n;i++) cout<<a[i]<<" ";
    return 0;
}
View Code

 

D. Beautiful Graph

題意:

給出一個圖,有n個點,m條邊,每個點都有權值1,2或3。現在要你給點權賦值,滿足相鄰的兩個點和為奇數。問一共有多少情況,注意這個圖不一定保證連通。

 

題解:

根據題意我們知道,相鄰的兩個點必然為一奇一偶,所以我們可以用二分圖染色來判斷是否給出的圖合法,能夠滿足條件。

在二分圖染色的過程中,記錄一下兩種顏色的個數a,b,那麼最終的答案就是對於每個圖的2^a+2^b再求和。

注意一下單獨一個點可能有1,2,3三種情況。

 

程式碼如下:

#include <bits/stdc++.h>
#define MOD 998244353
using namespace std;
typedef long long ll;
const int N = 3e5+5;
int T;
int n,m,flag,num,sum;
vector <int> g[N];
int color[N];
void dfs(int u,int c){
    color[u]=c;sum++;
    if(color[u]==1) num++;
    if(flag) return ;
    for(auto v:g[u]){
        if(!color[v]) dfs(v,3-c);
        else if(color[v]==c){
            flag=1;
            return ;
        }
    }
    return ;
}
ll quick(ll a,int b){
    ll ans = 1;
    while(b){
        if(b&1) ans=(ans*a)%MOD;
        a=(a*a)%MOD;
        b>>=1;
    }
    return ans ;
}
int main(){
    cin>>T;
    while(T--){
        scanf("%d%d",&n,&m);flag=0;
        for(int i=0;i<=n;i++) g[i].clear(),color[i]=0;
        for(int i=1;i<=m;i++){
            int u,v;
            scanf("%d%d",&u,&v);
            g[u].push_back(v);g[v].push_back(u);
        }
        int tot =0;
        ll ans =1;
        for(int i=1;i<=n;i++){
            if(!color[i] && !flag){
                num=0;sum=0;
                dfs(i,1);
                if(sum==1) ans=(ans*3)%MOD;
                else ans=(ans*(quick(2,num)+quick(2,sum-num))%MOD)%MOD;
            }
        }
        if(flag) printf("0\n");
        else printf("%I64d\n",ans);
    }
    return 0;
}
View Code