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; whileView Code(t--){ cin>>n; for(int i=2;i<=7;i++){ if(n%i!=1){ cout<<n/i+(n%i!=0)<<endl; break ; } } } return 0; }
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]View Code=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; }
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