absi2011's Blog & Daily Life.

全新的开始       我要省选翻盘       I wanna AK in 高考\化学       自此,生无可恋
[破碎的状态] [-57] Topcoder Open 2B
[破碎的状态] [-41] Google Code Jam Round 3辅助记

[破碎的状态] [-54] Google Code Jam 辅助经历

absi2011 posted @ May 29, 2016 10:51:37 PM in 网上比赛 with tags GCJ 小高考 瞎搞 , 530 阅读

拿到题

上来先让我看t2,思考一会儿感觉不会

题意:

给你个人,每个人有概率p会选择通过概率1-p选择不通过,求选k个人让平票概率最大(k是偶数)

不会做..

然后翻开t1

2^n个人在玩石头剪刀布循环赛

给你P个人一直出布,R个人出石头,S个人出剪刀

求给个方案使得比赛能打完..

妈呀这又是个不可做题

后来队友提出了个结论,瞬间成了[/tex]H_2O[/tex]题

结论:

max(P,R,S)-min(P,R,S)=1不然无解

然后...发现递归构造下就好

t2不是我做的..他给A掉了

t3不是我做的

t4是个奇怪的题,题意如下:

你有n个工人和n个机子,每个工人来的顺序是随机的

每个人来的时候会随机找个自己会开的而且没人的机子,开始工作

如果某个工人发现自己没机子了,那么他今天就不工作了

为了防止有人偷懒,你决定教某些人开某些机子(不允许让某人忘掉怎么开某机子),教一个人要1$

你需要知道怎么教才能确保让没有人偷懒不工作

[tex]O(2^{n^2}*n!*n^n)[/tex]的大暴力好啊..反正N<=4

过了..

0罚时0WA 果断晋级

俩题代码:

#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<sstream>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char ans[100005];
char now_ans[100005];
char next[10005];
void dfs(int x,int y,int z,int n)
{
    if (n==0)
    {
        if (x==1) ans[0]='P';
        if (y==1) ans[0]='R';
        if (z==1) ans[0]='S';
        return;
    }
    int t=min(min(x/2,y/2),z/2);
    int xx=x-t*2;
    int yy=y-t*2;
    int zz=z-t*2;
    if ((xx+yy+zz)==4)
    {
        if (xx==2) dfs(t+1,t,t+1,n-1);
        if (yy==2) dfs(t+1,t+1,t,n-1);
        if (zz==2) dfs(t,t+1,t+1,n-1);
    }
    else
    {
        if (xx==0) dfs(t,t+1,t,n-1);
        if (yy==0) dfs(t,t,t+1,n-1);
        if (zz==0) dfs(t+1,t,t,n-1);
    }
    int i;
    for (i=0;i<(1<<(n-1));i++)
    {
        now_ans[i*2]=ans[i];
        now_ans[i*2+1]=next[ans[i]];
    }
    memcpy(ans,now_ans,sizeof(ans));
}
int main()
{
    freopen("A-small.in","r",stdin);
    freopen("A-small.out","w",stdout);
    int t;
    scanf("%d",&t);
    int zu;
    next['P']='R';
    next['R']='S';
    next['S']='P';
    for (zu=0;zu<t;zu++)
    {
        printf("Case #%d: ",zu+1);
        int a,b,c,n;
        scanf("%d",&n);
        scanf("%d%d%d",&b,&a,&c);   //PRS
        if ((a-b>1)||(b-c>1)||(c-a>1)||(b-a>1)||(c-b>1)||(a-c>1))
        {
            puts("IMPOSSIBLE");
            continue;
        }
        dfs(a,b,c,n);
        int i;
        for (i=1;i<=n;i++)
        {
            int j;
            for (j=0;j<(1<<n);j+=(1<<i))
            {
                int k;
                for (k=0;k<(1<<(i-1));k++)
                {
                    if (ans[j+k]!=ans[j+(1<<(i-1))+k]) break;
                }
                if (ans[j+k]>ans[j+(1<<(i-1))+k])
                {
                    for (k=0;k<(1<<(i-1));k++)
                    {
                        swap(ans[j+k],ans[j+(1<<(i-1))+k]);
                    }
                }
            }
        }
        ans[1<<n]='\0';
        printf("%s\n",ans);
    }
    return 0;
}
#include<set>
#include<map>
#include<list>
#include<queue>
#include<stack>
#include<string>
#include<time.h>
#include<math.h>
#include<memory>
#include<vector>
#include<bitset>
#include<fstream>
#include<stdio.h>
#include<utility>
#include<sstream>
#include<string.h>
#include<iostream>
#include<stdlib.h>
#include<algorithm>
using namespace std;
char a[35][35];
int n;
int b[15];
bool used[15];
bool unok(int x)
{
    if (x==n) return false;
    int i;
    int sum=0;
    for (i=0;i<n;i++)
    {
        if (used[i]) continue;
        if (a[b[x]][i]=='1')
        {
            sum=1;
            used[i]=true;
            if (unok(x+1)) return true;
            used[i]=false;
        }
    }
    if (sum==0) return true;
    return false;
}
bool check()
{
    int i;
    for (i=0;i<n;i++)
    {
        b[i]=i;
        used[i]=false;
    }
    for (;;)
    {
        if (unok(0)) return false;
        if (!next_permutation(b,b+n)) return true;
    }
}
int main()
{
    freopen("D-small.in","r",stdin);
    freopen("D-small.out","w",stdout);
    int t;
    scanf("%d",&t);
    int zu;
    for (zu=0;zu<t;zu++)
    {
        printf("Case #%d: ",zu+1);
        int i;
        scanf("%d",&n);
        for (i=0;i<n;i++)
        {
            scanf("%s",a[i]);
        }
        int max_ans=10000;
        for (i=0;i<(1<<(n*n));i++)
        {
            int j;
            int sum=0;
            for (j=0;j<(n*n);j++)
            {
                int t1=j/n;
                int t2=j%n;
                if ((1<<j)&i) continue;
                if (a[t1][t2]=='1') break;
                sum++;
            }
            if (j!=n*n) continue;
            if (sum>=max_ans) continue;
            for (j=0;j<(n*n);j++)
            {
                int t1=j/n;
                int t2=j%n;
                if ((1<<j)&i) continue;
                a[t1][t2]='1';
            }
            if (check()) max_ans=sum;
            for (j=0;j<(n*n);j++)
            {
                int t1=j/n;
                int t2=j%n;
                if ((1<<j)&i) continue;
                a[t1][t2]='0';
            }
        }
        printf("%d\n",max_ans);
    }
    return 0;
}

登录 *


loading captcha image...
(输入验证码)
or Ctrl+Enter