1. 程式人生 > >codeforces Educational Codeforces Round 56 (Rated for Div. 2) 部分題解

codeforces Educational Codeforces Round 56 (Rated for Div. 2) 部分題解

A. Dice Rolling

題目:

傳送門A

題意:

就是求任意需要篩幾次達到目標值

程式碼如下:
 

#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

題目:

傳送門D

題意:
給出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;
}