codeforces Educational Codeforces Round 56 (Rated for Div. 2) 部分題解
阿新 • • 發佈:2018-12-19
A. Dice Rolling
題目:
題意:
就是求任意需要篩幾次達到目標值
程式碼如下:
#include <bits/stdc++.h> using namespace std; int t; int x; int main() { scanf("%d",&t); while (t--) { scanf("%d",&x); if(x%7==0) { printf("%d\n",x/7); } else { printf("%d\n",x/7+1); } } return 0; }
B. Letters Rearranging
題目:
傳送門B
題意:
給出一個字串,將其中任意一個不為迴文字串的輸出。
思路:
首先,看看是否都由一個字元組成,如果是,則直接輸出-1.
接下來就判斷是否為迴文字串,若為,則交換任意兩個不同的字元,然後輸出即可。
程式碼如下:
#include <bits/stdc++.h> using namespace std; int t; char s[1005]; map<char,int>ma; bool judge () { int len=strlen(s); for (int i=0;i<len/2;i++) { if(s[i]!=s[len-1-i]) return false; } return true; } int main() { scanf("%d",&t); while (t--) { scanf("%s",s); int len=strlen(s); ma.clear(); for (int i=0;i<len;i++) { ma[s[i]]=1; } if(ma.size()==1) { printf("-1\n"); continue; } if(!judge()) { printf("%s\n",s); } else { for (int i=1;i<=len/2;i++) { if(s[0]!=s[i]) { swap(s[0],s[i]); break; } } printf("%s\n",s); } } return 0; }
C. Mishka and the Last Exam
題目:
傳送門C
題意:
給出一個b陣列和a陣列的長度n,其中b[i]=a[i]+a[n-1-i];
輸出任意一個滿足條件的a陣列
a陣列是非遞減排序的。
思路:
一開始令a[0]=0,a[n-1]=b[0],然後遍歷b陣列元素。
(1)如果b[i]>=b[i-1],a[i]等於在加上a[i-1]的基礎上加上b[i]-b[i-1]的差值
(2) 如果b[i]<b[i-1],則a[i]=a[i-1].
a[n-1-i]=b[i]-a[i];
程式碼如下:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=2*1e+5+5;
ll b[maxn];
ll a[maxn];
int n;
int main()
{
scanf("%d",&n);
for (int i=0;i<n/2;i++)
{
scanf("%lld",&b[i]);
}
a[0]=0;
a[n-1]=b[0]-a[0];
for (int i=1;i<n/2;i++)
{
if(b[i]>=b[i-1])
{
a[i]=a[i-1]+b[i]-b[i-1];
a[n-1-i]=b[i]-a[i];
}
else
{
a[i]=a[i-1];
a[n-1-i]=b[i]-a[i];
}
}
for (int i=0;i<n;i++)
{
printf("%lld%c",a[i],i==n-1?'\n':' ');
}
return 0;
}
D. Beautiful Graph
題目:
題意:
給出n個頂點,m條邊,每個頂點有1,2,3個值可以選擇,要求每條邊所連的兩個頂點的和必須為奇數,
求有多少種方法滿足條件。
思路:
dfs,這題卡vector,vector建圖會超時,得優化優化。就是用多少個頂點,清理多少個vector陣列。
程式碼如下:
#include <bits/stdc++.h>
using namespace std;
const int maxn=3*1e5+5;
int t;
typedef long long ll;
const ll mod=998244353;
vector<int>v[maxn],re;
int n,m;
int vis[maxn];
int visnum;
int edge;
int flag;
ll ans;
int visa,visb;
void dfs (int x,int num)
{
vis[x]=num;
if(num%2)
visa++;
else
visb++;
int Size=v[x].size();
for (int i=0;i<Size;i++)
{
int e=v[x][i];
if(vis[e]!=-1)
{
if(vis[e]==num)
{
flag=1;
}
}
else
dfs(e,num^1);
}
}
ll pow_mod(ll a, ll b)
{
ll ans = 1;
while(b){
if(b&1){
ans = (ans * a) % mod;
}
a = (a * a) % mod;
b >>= 1;
}
return ans;
}
int main()
{
scanf("%d",&t);
while (t--)
{
ans=1;
scanf("%d%d",&n,&m);
for (int i=0;i<=n;i++)
{
v[i].clear();
vis[i]=-1;
}
for (int i=0;i<m;i++)
{
int x,y;
scanf("%d%d",&x,&y);
v[x].push_back(y);
v[y].push_back(x);
}
flag=0;
for (int i=1;i<=n;i++)
{
if(vis[i]==-1)
{
visa=0;visb=0;
dfs(i,1);
ans*=(pow_mod(2,visa)+pow_mod(2,visb))%mod;
ans%=mod;
}
}
if(flag)
{
printf("0\n");
}
else
{
printf("%I64d\n",ans);
}
}
return 0;
}