Card 官方说明

· · 科技·工程

一共五组 bot ,期望难度递增,全部挑战成功通关。

第三组和第四组挑战失败有一次复活机会

每个 bot 采取七局四胜制。

每一局中,双方在每一回合轮流出牌,用户先手。

输入 n,得到 n 种手牌权值和当前数量。

出牌规则是,取出自己可重集真子集,计算双方出牌集合对应权值总和比值。

对于比例根据 check 函数,计算谁获胜/打平。

失败方卡牌归属获胜方。

- 特殊奖励/惩罚 三连胜会获得随机抽取对手若干张牌给用户。 两连败会失去若干张牌给对手。 每 $5$ 个回合折算最近五个回合胜负数量,例如 $3:2$,$4:1$,先手胜得到奖励,后手胜会得到期望更少奖励和对先手较小惩罚。 - 特殊指令 1. All_in 命令,打出所有手牌。 2. Random 命令,随机打出手牌。 3. Half 命令,打出每种一半手牌(上取整)。 4. Throw S 命令,打完 $S$ 集合内对应**种类**手牌。 所有的不合法请求会被过滤。 交互库会分析你**之前**决策辅助自己相对随机决策,而不会参考你**当前**决策。 ```cpp #include <cstdio> #include <algorithm> #include <cstring> #include <string> #include <iostream> #include <vector> #include <queue> #include <random> #include <ctime> #include <cassert> #include <unistd.h> using namespace std; #define PII pair<int,int> #define x first #define y second #define For(i, l, r) for(int i = l; i <= r; i ++) #define Rep(i, l, r) for(int i = l; i >= r; i --) bool START; void in(int &x) { char c = getchar(); int op = 1; while(c > '9' || c < '0') op *= (c == '-' ? -1 : 1), c = getchar(); for(x = 0; c >= '0' && c <= '9'; c = getchar()) x = x * 10 + c - '0'; x *= op; } const int N=1400; int n,m,a[N],V=10,b[N],c[N],d[N],v[N],Z[N]; mt19937 seed(time(0)); uniform_int_distribution<int> d1; int gen(int x){return d1(seed)%x+1;} int Gen(int x){return d1(seed)%(x+1);} int check(double k) { if(k>1&&k<=2)return 1; if(k>2&&k<3.5)return Gen(2)==2; if(k>=3.5&&k<=5)return 1; if(k>5&&k<7)return Gen(3)==3; if(k>=7)return gen(k*1.5)>1; return 0; } int win[N]; int p1[N<<4],p2[N<<4]; bool ENDPOS = 0; int solve1(int tst) { double bili=1; if(tst==1)bili=1.2; else if(tst==2)bili=1; else if(tst==3) bili=0.9; else if(tst==4) bili=0.8; else bili=0.75; int win1=0,win2=0; int f2=0,f1=0,Case=7; puts("Match Begins!!"); For(us,1,Case) { For(i,1,6)puts("\n"); puts("---------------------"); cout<<"Match "<<us<<endl; cout<<"input n\n"; in(n); cout<<"Here are the values\n"; For(i,1,n)v[i]=gen(V);sort(v+1,v+n+1); For(i,1,n)cout<< v[i] <<" ";cout<<endl; // For(i,1,n)a[i]=c[i]=2; For(i,1,n)Z[i]=Gen(5)+7, a[i]=Gen(Z[i]*bili),a[i]=min(a[i],Z[i]),a[i]=max(a[i],1), c[i]=Z[i]-a[i]; double av=0; int w1=0,w2=0,my,his; For(ks,1,1000) { For(i,1,n)d[i]=Gen(c[i]); int ss=0,own=0,sa=0,sc=0,ns=0; For(i,1,n)sa+=a[i],sc+=c[i]; For(i,1,n)own+=v[i]*a[i]; if(ks>1) own=own*av/(ks-1)+1; else own=gen(own); For(i,1,n)ss+=v[i]*d[i],ns+=c[i]*v[i]; int ps=0,sui=gen(ns); while(!ss||ps<=10) { if(ks==1) {if(ss>=sui)break;} if(ks>1) if((ss>own&&check(ss*1.0/own))||(ss<own&&!check(1.0*own/ss)))break; For(i,1,n)d[i]=Gen(c[i]); ss=0; For(i,1,n)ss+=v[i]*d[i]; ps++; } // printf("ss=%d,own=%d\n",ss,own); puts("---------------"); printf("Round #%d\n",ks); printf("Card numbers : %d / %d\n",sa,sc); cout<<"Give Your Choise\n"; For(i,1,n) printf("%d ", a[i]);puts(""); string Boot; cin>>Boot; For(i,1,n)b[i]=0; if(Boot=="All_in") For(i,1,n)b[i]=a[i]; else if(Boot=="Random") { For(i,1,n)if(a[i]) b[i]=gen(a[i]); } else if(Boot=="Half") { For(i,1,n)if(a[i])b[i]=(a[i]+1)/2; } else if(Boot=="Throw") { string Kt;cin>>Kt;for(char c:Kt)b[c-'A'+1]=a[c-'A'+1]; } else for(char c:Boot)b[c-'A'+1]++; int zon=0; int ca=0; For(i,1,n) { zon+=a[i]*v[i]; if(b[i]>a[i])b[i]=a[i];ca+=b[i]*v[i]; } av+=1.0*ca/zon; while(!ca) { puts("Wrong Format! input Again!\n"); cin>>Boot; For(i,1,n)b[i]=0; for(char c:Boot)b[c-'A'+1]++; ca=0; For(i,1,n) { if(b[i]>a[i])b[i]=a[i];ca+=b[i]*v[i]; } } printf("current value = %d\n",ca); puts("Now wait -----");sleep(1); For(i,1,n)For(j,1,d[i])printf("%c", i+'A'-1); printf("\nenermy_val = %d\n", ss); if(ca==ss){puts("Tie");win[ks]=0;w1=w2=0;} else if((ca>ss&&check(1.0*ca/ss))||(ca<ss&&!check(1.0*ss/ca))) { printf("You get his cards! /fendou\n"); For(i,1,n)a[i]+=d[i],c[i]-=d[i]; win[ks]=1;w1++;w2=0; } else { printf("He gets your cards! /ll\n"); For(i,1,n)c[i]+=b[i],a[i]-=b[i]; win[ks]=-1;w2++;w1=0; } my=0,his=0; For(i,1,n)my+=v[i]*a[i],his+=c[i]*v[i]; if(his==0){printf("my = %d, his = %d\n",my,his);puts("You Win!!!");win1++; break; 0;} if(!my){printf("my = %d, his = %d\n",my,his);puts("You Lose!!!");win2++; break; 0;} puts("\n"); if(w1==3) { vector<int> vec; For(i,1,n)if(c[i])vec.push_back(i); shuffle(vec.begin(), vec.end(),seed); // c[vec[0]]--;a[vec[0]]++; int sz=vec.size(); For(j,0,min(sz-1,gen(6)+4))c[vec[j]]--,a[vec[j]]++; printf("Hat-trick win!\n"); w1=0; } if(w2==2) { vector<int> vec; For(i,1,n)if(a[i])vec.push_back(i); shuffle(vec.begin(), vec.end(),seed); // a[vec[0]]--;c[vec[0]]++; int sz=vec.size(); For(j,0,min(sz-1,gen(4)+2))c[vec[j]]++,a[vec[j]]--; printf("Double lose!\n"); w2=0; } my=0,his=0; For(i,1,n)my+=v[i]*a[i],his+=c[i]*v[i]; if(his==0){printf("my = %d, his = %d\n",my,his);puts("You Win!!!");win1++; break; 0;} if(!my){printf("my = %d, his = %d\n",my,his);puts("You Lose!!!");win2++; break; 0;} if(ks%5==0) { int no=0,g1=0,g2=0; For(j,ks-4,ks)no+=win[j],g1+=(win[j]==1),g2+=(win[j]==-1); p1[0]=p2[0]=0; For(i,1,n)For(j,1,a[i])p1[++p1[0]]=i; For(i,1,n)For(j,1,c[i])p2[++p2[0]]=i; shuffle(p1+1,p1+p1[0]+1,seed); shuffle(p2+1,p2+p2[0]+1,seed); puts("\n\n\n"); printf("Part Score %d : %d\n",g1,g2); puts("/----------------------/"); if(!no) { puts("Both Excellent!!\nReward You And Bot!!"); int u=gen(6); printf("number = %d\n",u); For(i,1,u) { int x=gen(n),y=gen(n); printf("New card : %c %c\n",x+'A'-1,y+'A'-1); a[x]++;c[y]++; } } else if(no>0) { puts("You Are Better than Bot!!\nThis Is For You!!"); int u=gen(8)+8; if(no>1) { if(no==2)u=gen(10)+10; else if(no==3) u=gen(12)+12; else u=15+gen(15); } printf("number = %d\n",u); For(i,1,u) { int x=gen(n);a[x]++; printf("New card %c\n", x+'A'-1); } } else { puts("Bot is Great!!\nYou should work harder!!"); int u=gen(3)+3,v=gen(4)+4;u=min(u,p1[0]); if(no<-1) { if(no==-2)v=gen(5)+5; else if(no==-3) v=gen(5)+6; else v=gen(6)+6; } For(i,1,u) { a[p1[i]]--; printf("Delete card(You) : %c\n", p1[i]+'A'-1); } puts("======="); For(i,1,v) { int x=gen(n);c[x]++; printf("New card(Bot) : %c\n", x+'A'-1); } } puts("/----------------------/"); puts("\n\n\n"); } my=0,his=0; For(i,1,n)my+=v[i]*a[i],his+=c[i]*v[i]; if(his==0){printf("my = %d, his = %d\n",my,his);puts("You Win!!!");win1++; break;} if(!my){printf("my = %d, his = %d\n",my,his);puts("You Lose!!!");win2++; break;} printf("my = %d, his = %d\n",my,his); if(ks%2==0) { printf("val_s -> ");For(i,1,n)printf("%d ", v[i]);puts(""); } } f1+=my;f2+=his; if(win1==4||win2==4)break; } puts("\n\n\n\n\n\n\n\n"); puts("-----------------"); printf("The Total Score is %d : %d\n",win1,win2); printf("Mark is %d : %d\n",f1,f2); // puts("Game Over!!\nWelcome next time!"); puts("-----------------------------------------"); For(i,1,15) puts(""); return win1>win2; } int dd[N],ee[N]; int sl,sr; int Win(int x,int y) { if(x==y) return 0; if(x>y) return check(x*1.0/y); return -check(y*1.0/x); } int calc(int ss) { int res=0; For(x,sl,sr) { res+=Win(ss,x); } return res; } int solve2(int tst) { double bili=1; if(tst==1)bili=1.3; else if(tst==2)bili=1.15; else if(tst==3) bili=1; else if(tst==4) bili=0.9; else bili=0.75; int win1=0,win2=0; int f2=0,f1=0,Case=7; puts("Match Begins!!"); For(us,1,Case) { For(i,1,6)puts("\n"); puts("---------------------"); cout<<"Match "<<us<<endl; cout<<"input n\n"; in(n); cout<<"Here are the values\n"; For(i,1,n)v[i]=gen(V);sort(v+1,v+n+1); For(i,1,n)cout<< v[i] <<" ";cout<<endl; // For(i,1,n)a[i]=c[i]=2; For(i,1,n)Z[i]=Gen(5)+7, a[i]=Gen(Z[i]*bili),a[i]=min(a[i],Z[i]),a[i]=max(a[i],1), c[i]=Z[i]-a[i]; double av=0; int w1=0,w2=0,my,his; For(ks,1,1000) { For(i,1,n)d[i]=Gen(c[i]); int ss=0,own=0,sa=0,sc=0,ns=0; For(i,1,n)sa+=a[i],sc+=c[i]; For(i,1,n)own+=v[i]*a[i];ns=own; if(ks>1) own=own*av/(ks-1)+1; sl=max(1,own-70); sr=min(own+70,ns); For(i,1,n)ss+=v[i]*d[i]; int ps=0; if(ks==1) { ss=0; For(i,1,n)d[i]=Gen(c[i]*1.8),d[i]=min(d[i],c[i]),ss+=v[i]*d[i]; if(!ss) {For(i,1,n)if(c[i]){d[i]=1;ss+=v[i]; break;}} } else { int ans=-1; For(i,1,n)ee[i]=d[i]; if(!ss) { For(i,1,n)if(c[i]){ee[i]=1;break;}ans=0; } while(ps<=20) { if(ss) { int tmp=calc(ss); if(tmp>ans){ans=tmp;For(i,1,n)ee[i]=d[i];} // if((ss>own&&check(ss*1.0/own))||(ss<own&&!check(1.0*own/ss)))break; } For(i,1,n)d[i]=Gen(c[i]*1.1),d[i]=min(d[i],c[i]); ss=0; For(i,1,n)ss+=v[i]*d[i]; ps++; } ss=0; For(i,1,n)d[i]=ee[i],ss+=v[i]*d[i]; } // printf("ss=%d,own=%d\n",ss,own); puts("---------------"); printf("Round #%d\n",ks); printf("Card numbers : %d / %d\n",sa,sc); cout<<"Give Your Choise\n"; For(i,1,n) printf("%d ", a[i]);puts(""); string Boot; cin>>Boot; For(i,1,n)b[i]=0; if(Boot=="All_in") For(i,1,n)b[i]=a[i]; else if(Boot=="Random") { For(i,1,n)if(a[i]) b[i]=gen(a[i]); } else if(Boot=="Half") { For(i,1,n)if(a[i])b[i]=(a[i]+1)/2; } else if(Boot=="Throw") { string Kt;cin>>Kt;for(char c:Kt)b[c-'A'+1]=a[c-'A'+1]; } else for(char c:Boot)b[c-'A'+1]++; int zon=0; int ca=0; For(i,1,n) { zon+=a[i]*v[i]; if(b[i]>a[i])b[i]=a[i];ca+=b[i]*v[i]; } av+=1.0*ca/zon; while(!ca) { puts("Wrong Format! input Again!\n"); cin>>Boot; For(i,1,n)b[i]=0; for(char c:Boot)b[c-'A'+1]++; ca=0; For(i,1,n) { if(b[i]>a[i])b[i]=a[i];ca+=b[i]*v[i]; } } printf("current value = %d\n",ca); puts("Now wait -----");sleep(1); For(i,1,n)For(j,1,d[i])printf("%c", i+'A'-1); printf("\nenermy_val = %d\n", ss); if(ca==ss){puts("Tie");win[ks]=0;w1=w2=0;} else if((ca>ss&&check(1.0*ca/ss))||(ca<ss&&!check(1.0*ss/ca))) { printf("You get his cards! /fendou\n"); For(i,1,n)a[i]+=d[i],c[i]-=d[i]; win[ks]=1;w1++;w2=0; } else { printf("He gets your cards! /ll\n"); For(i,1,n)c[i]+=b[i],a[i]-=b[i]; win[ks]=-1;w2++;w1=0; } my=0,his=0; For(i,1,n)my+=v[i]*a[i],his+=c[i]*v[i]; if(his==0){printf("my = %d, his = %d\n",my,his);puts("You Win!!!");win1++; break; 0;} if(!my){printf("my = %d, his = %d\n",my,his);puts("You Lose!!!");win2++; break; 0;} puts("\n"); if(w1==3) { vector<int> vec; For(i,1,n)if(c[i])vec.push_back(i); shuffle(vec.begin(), vec.end(),seed); // c[vec[0]]--;a[vec[0]]++; int sz=vec.size(); For(j,0,min(sz-1,gen(6)+4))c[vec[j]]--,a[vec[j]]++; printf("Hat-trick win!\n"); w1=0; } if(w2==2) { vector<int> vec; For(i,1,n)if(a[i])vec.push_back(i); shuffle(vec.begin(), vec.end(),seed); // a[vec[0]]--;c[vec[0]]++; int sz=vec.size(); For(j,0,min(sz-1,gen(4)+2))c[vec[j]]++,a[vec[j]]--; printf("Double lose!\n"); w2=0; } my=0,his=0; For(i,1,n)my+=v[i]*a[i],his+=c[i]*v[i]; if(his==0){printf("my = %d, his = %d\n",my,his);puts("You Win!!!");win1++; break; 0;} if(!my){printf("my = %d, his = %d\n",my,his);puts("You Lose!!!");win2++; break; 0;} if(ks%5==0) { int no=0,g1=0,g2=0; For(j,ks-4,ks)no+=win[j],g1+=(win[j]==1),g2+=(win[j]==-1); p1[0]=p2[0]=0; For(i,1,n)For(j,1,a[i])p1[++p1[0]]=i; For(i,1,n)For(j,1,c[i])p2[++p2[0]]=i; shuffle(p1+1,p1+p1[0]+1,seed); shuffle(p2+1,p2+p2[0]+1,seed); puts("\n\n\n"); printf("Part Score %d : %d\n",g1,g2); puts("/----------------------/"); if(!no) { puts("Both Excellent!!\nReward You And Bot!!"); int u=gen(6); printf("number = %d\n",u); For(i,1,u) { int x=gen(n),y=gen(n); printf("New card : %c %c\n",x+'A'-1,y+'A'-1); a[x]++;c[y]++; } } else if(no>0) { puts("You Are Better than Bot!!\nThis Is For You!!"); int u=gen(8)+8; if(no>1) { if(no==2)u=gen(10)+10; else if(no==3) u=gen(12)+12; else u=15+gen(15); } printf("number = %d\n",u); For(i,1,u) { int x=gen(n);a[x]++; printf("New card %c\n", x+'A'-1); } } else { puts("Bot is Great!!\nYou should work harder!!"); int u=gen(3)+3,v=gen(4)+4;u=min(u,p1[0]); if(no<-1) { if(no==-2)v=gen(5)+5; else if(no==-3) v=gen(5)+6; else v=gen(6)+6; } For(i,1,u) { a[p1[i]]--; printf("Delete card(You) : %c\n", p1[i]+'A'-1); } puts("======="); For(i,1,v) { int x=gen(n);c[x]++; printf("New card(Bot) : %c\n", x+'A'-1); } } puts("/----------------------/"); puts("\n\n\n"); } my=0,his=0; For(i,1,n)my+=v[i]*a[i],his+=c[i]*v[i]; if(his==0){printf("my = %d, his = %d\n",my,his);puts("You Win!!!");win1++; break;} if(!my){printf("my = %d, his = %d\n",my,his);puts("You Lose!!!");win2++; break;} printf("my = %d, his = %d\n",my,his); if(ks%2==0) { printf("val_s -> ");For(i,1,n)printf("%d ", v[i]);puts(""); } } f1+=my;f2+=his; if(win1==4||win2==4)break; } puts("\n\n\n\n\n\n\n\n"); puts("-----------------"); printf("The Total Score is %d : %d\n",win1,win2); printf("Mark is %d : %d\n",f1,f2); // puts("Game Over!!\nWelcome next time!"); puts("-----------------------------------------"); For(i,1,15) puts(""); return win1>win2; } int main() { puts("There are five monsters here waiting for your challenge"); string name; int fuhuo=0; puts("input your favourite TEAM"); cin>>name; puts("Let's Go!!!"); For(i,1,5) { int x=gen(2),y; if(i==5)x=2; printf("TYPE = %d\n",x); if(i==1) printf("1/8 Final!!!\n"); if(i==2) printf("1/4 Final!!!\n"); if(i==3) printf("1/2 Final!!!\n"); if(i==4) printf("Western/Eastern Final!!!\n"); if(i==5) printf("Last Final!!!\n"); if(x==1) y=solve1(i); else y=solve2(i); if(!y) { if(!fuhuo&&i>=3&&i<5) { fuhuo=1; i--;continue; } printf("Final Standing\n"); if(i==1) printf("One Round Tour\n"); if(i==2) printf("1/8 Final\n"); if(i==3) printf("1/4 Final\n"); if(i==4) printf("1/2 Final\n"); if(i==5) printf("Western/Eastern Champion\n"); puts("Game Over!!\nWelcome next time!");return 0; } } printf("Whole Champion!!!!\n"); cout <<name<<" "; puts("is the champion!!!"); } ```