牛客練習賽76

A.校園活動

鏈接:https://ac.nowcoder.com/acm/contest/10845/A
來源:牛客網

牛牛中學爲了給本校的OIer放鬆心情,決定舉報一場校園活動。
現在學校的共有 個OIer,學校想把他們分爲一些小組進行一個團隊遊戲。學校先了解了一下每個同學對這個團隊遊戲的瞭解程度。
爲了遊戲的公平,學校需要使分組後的每一個小組內所有人對遊戲的瞭解程度之和相等,
但同學們並不希望完全由學校來給他們分組,所以這 個人站爲了一行,學校只能將隊列中一段完整的子隊列作爲一個小組。
換句話說,如果你想讓位置爲  的人在一個小組裏,你就必須讓 和 之間的所有人在這個組裏面。
當然,我們知道如果只有一個小組是無法進行遊戲的。
你需要判斷是否可以將他們成功分組進行遊戲,如果能成功分組進行遊戲就打印出最多能分爲多少個小組,不能成功分組進行遊戲(所有人都在同一個組裏)打印“-1”。

/*直接從大到小枚舉答案*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define maxn 1010
using namespace std;

int n,a[maxn],ans,sum;
char s[maxn];

int main(){
    scanf("%d",&n);
    scanf("%s",s+1);
    for(int i=1;i<=n;i++){
        a[i]=s[i]-'0';
        sum+=a[i];
    }
    ans=n;//分成ans個組
    while(ans>=2){
        int lim=sum/ans;//每組和爲lim
        if(sum%ans!=0){
            ans--;
            continue;
        }
        int nowSum=0;
        for(int i=1;i<=n;i++){
            if(nowSum<lim){
                nowSum+=a[i];
            }
            if(nowSum>lim)break;
            if(nowSum==lim)nowSum=0;
        }
        if(nowSum!=0){
            ans--;
            continue;
        }
        else break;
    }
    if(ans>=2)
        printf("%d\n",ans);
    else puts("-1");
    system("pause");
    return 0;
}

B.zzugzx (vs) Kurisu

鏈接:https://ac.nowcoder.com/acm/contest/10845/B
來源:牛客網

zzugzx和Kurisu做遊戲,輪流扔n個回合骰子,骰子的m個面是[0,m-1],由zzugzx先手

每個人需要維護一個長n的m進制數,開始兩個人的n個位置都是空的

每次會隨機搖到一個數,然後可以選擇填充到任意一個未被填充的位置

衆所周知,zzugzx和Kurisu都足夠聰明,問最後zzugzx勝利的概率.

(只有最後zzugzx的數字大於Kurisu纔算贏,否則Kurisu贏)

/*
    記憶化搜索,模擬每回合的所有情況,將每種情況的概率相加
*/
#include <iostream>
#include <cstdio>
#include <cstring>
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))
using namespace std;
double f[5010][5010];
bool vis[5010][5010];
int n,m;
double dfs(int step,int a,int b){
    if(step==0)return a>b;
    if(vis[a][b])return f[a][b];
    vis[a][b]=1;
    if(step%2==0){
        for(int i=1;i<=m;i++){
            double mx=0;
            int now=a,base=i;
            for(int j=1;j<=n;j++){
                if(now%(m+1)==0)
                    mx=max(mx,dfs(step-1,a+base,b));
                base*=m+1;
                now/=m+1;
            }
            f[a][b]+=mx/(double)m;
        }
    }
    if(step%2!=0){
        for(int i=1;i<=m;i++){
            double mn=1;
            int now=b,base=i;
            for(int j=1;j<=n;j++){
                if(now%(m+1)==0)
                    mn=min(mn,dfs(step-1,a,b+base));
                base*=m+1;
                now/=m+1;
            }
            f[a][b]+=mn/(double)m;
        }
    }
    return f[a][b];
}
int main(){
    scanf("%d%d",&n,&m);
    printf("%.10lf\n",dfs(2*n,0,0));
    system("pause");
    return 0;
}

 

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章