【Test】[20111003][字符串模拟+博弈论+组合+猥琐动归]

【闲话】

第一题:WWWWWWWWAA

第二题:AAAAAAAAAT

第三题:WWWWWWWAAA

第四题:AWWWWWWWWW

随手改了改….就成了

第一题:AAAAAAAAAA

第二题:AAAAAAAAAA

第三题:WWWWWWWAAA

第四题:AWWWWWWWWW

第三题其实也巨水,就是一个高中数学题,而且组合数连高精都不用加….

第四题一看就是动归,但是优先级条件太多,读不清楚,于是没有写…Maxingc贪心也似写出了方程,神奇也似AC了…Orz

【题目】

◇第一题

题目描述:

一年一度的CS联赛开始了,bright义无反顾地加入了比赛。作为一名正直的孩子,bright当然选择了当一名反恐精英。经过若干局的比赛,bright拥有了N元钱(N<=16000)。但是悲剧的是,bright不慎在上一局拆弹时炸弹引爆,英勇就义。所以这一局bright出来时,身上只有一把可怜的小手.枪。于是bright开始买枪了。你的任务是写一个买枪的程序,统计bright到底买了什么枪。

买枪的方法是这样:

先按下B键,进入购买主菜单;

接下来按一个数字,进入对应的枪械子菜单;

然后再按一个数字,购买对应的枪械或者其他物品(比如防爆盾)。

按1买手.枪:再按1~5 可分别买价格为400,500,600,650,750的手.枪

接下来的描述类似

2 散弹枪:1700,3000

3 微型冲锋枪:1250,1500,1700,2350

4 自动步枪:2250,2750,3100,3500,4200,4750

5 机关枪:5750 (俗称大菠萝)

6 主武器弹药:50

7 副武器弹药:25

8 装备:防弹衣650 防弹衣+头盔1000 闪光弹200 高爆手雷300 烟雾弹300 拆弹装备200 夜视仪1250 防爆盾2200

例如按下B43,bright就花了3100块买了他珍爱的M4

特别的是 购买弹药不需按第二个数字,只要按B6或B7就行了

简单起见,我们将第x类的第y件武器编号Bxy

其中要注意的是,主武器为菜单中的B2~B5类,副武器是B1类,就是手.枪,

一开始bright就拥有B12这把警用手.枪

当买了一把枪,如果bright持有对应的主武器或者副武器,并且持有的枪与购买的枪不同,那么bright会将原来的枪丢去,获得新枪。若持有相同的武器或者钱不够购买新枪则购买失败。

防爆盾属于主武器,拿盾时只能持手.枪(刀——也算吧),防爆盾不算枪

两种弹药最多各有5份,只能在当前拥有对应的武器时才能购买,若该武器被扔了,子弹也消失。不同的枪要配不同的子弹。

一开始没有弹药,没有枪时购买对应弹药也失败。

高爆手雷,烟雾弹,拆弹装备,夜视仪最多只能持有一个,若重复购买,则购买失败

闪光弹最多拿2个

对于防弹衣,没头盔的可以升级为头盔,当然也要花1000元,若是有了头盔的防弹衣再去买普通的防弹衣,购买也失败

钱不够肯定购买失败,失败时钱不变化,当前装备不变化。

输入说明:

第一行:开始拥有的钱N

第二行:一串字符,由若干部分组成,每段开头为一个B,之后有1个或2个数字。bright不会按错键,所以不必考虑错误按键造成的结果。每段之间没有分隔符,所以只有一行。一共不超过100个字符

输出说明:

第一行:一个整数,表示最后剩下了多少钱

第二行:输出主武器的编号,一个空格,及主武器弹药的数量(可为0)。没有主武器则输出empty。

第三行:输出副武器的编号,一个空格,及副武器弹药的数量(可为0)。没有副武器则输出empty。

第四行:输出剩余的装备,按字典序输出,有几个则输出几个,按字典序排列。中间没有任何分隔符。

输入样例

16000

B14B7B7B7B7B7B7B46B6B6B83B83B84

输出样例

9675

B46 2

B14 5

B83B83B84

【解析】

大模拟,一定要注意所有的条件。没啥说的…..以后不会再犯低级错误了。

◇第二题

题目描述:

Ymq和hy正在玩一个数字游戏,其中某人(恩~)暗暗请你帮助她获胜。这个游戏是这样的。一开始有一个数n(1<=n<=1000000),两个人轮流对n进行操作。每次可将n减去它的最大或最小的非零数位。比如3014最大的数位是4,最小的是1,于是它可以减去4或者1,分别产生3010和3013。直到n变成0时停止,谁将n变为0则获胜。

根据某种RP因素,游戏都由hy先做。

输入说明:

第一行是一个整数G(1<=G<=100),表示她们玩了G局游戏;

接下来G行每行是一个数n。

输出说明:

一共G行,每行输出一串字符。Hy赢了则输出hy,ymq赢了则输出ymq。

输入样例:

2

9

10

输出样例:

hy

ymq

【解析】

F[i]表示拿到i数字,hy是否手必胜策略。

边界 F[0]=false;F[1..9]=true;

方程F[i]=(not F[i-max])or(not F[i-min])

◇第三题

题目描述

回忆当年apio,与fish,bright,gx三巨牛玩拖拉机的场景还历历在目。其中有一局 gx和我打A,摸牌时都没人亮牌。刚摸完牌时,gx突然说:“我手上有个A”。此时bright开始嘀咕了,可能gx不止有一个A吧。可是仍然没有人亮牌。就在要翻底牌的时候,gx将手中的黑桃A亮了出来,此时fish大吼:“啊!你A怎么那么多?”。当时的我很是迷茫,于是想请教您:

1、Gx说手上有1个A,那么他手上有不止1个A的概率是多少?

2、GX亮出黑桃A后,他手上有不止1个A的概率又是多少?

为了描述更清楚些,规定一副牌有n张,gx拿到了m张,黑桃A只有一张,而A一共有K张(和正常的不一样哦)。底牌是归我的,而且gx是不会撒谎的。

输入说明:

一行3个由空格隔开的整数,n,m,k

输出说明:

输出一行,两个实数,空格隔开,小数点后保留4位。分别为第一个问题和第二个问题的答案

输入样例:

52 13 4

输出样例:

0.3696

0.5612

数据范围

对于30%的数据n<=30,m<=15

对于100%的数据m<=n<=1,000,000

【解析】

数学问题。

第一问只要看清有一张A了已经…

第二问也一样。

◇第四题

题目描述:

传说中的sunglasses男又在整队了。他站在主席台上,发现只有12班的队伍排的最差。然而你是传说班中的体育委员,在听到sunglasses男的大喝后便不得不整队伍了。传说班队伍中有n个哥,他们站成一排,第i个人分别距离你D_i(D_i是整数)。操场的宽度是L。现在你要命令哥们向前或向后移动了。sunglasses男的要求很苛刻,首先n-1个相邻的哥的距离必须尽可能的大,当然他想让距离尽可能得相同。因此任意两个相邻的哥相距必须与(L-1)/(n-1)【使用整数除法】相差最多为1,而且距离为(L-1)/(n-1)(整数除 div)的个数尽可能的多。比如说,当n=4,L=8时,可以满足的位置是1,3,5,8或1,3,6,8,但是1,2,4,7或1,2,4,8不可以。

现在你应该如何安排哥们移动,使得队伍满足sunglasses男的要求,并且移动的总步数尽量小。

哥们都必须在整数点移动并且坐标应该大于零(不能撞上你),不大于L(不能出操场)。

输入格式:

第1行:2个整数n和L

第2至n+1行:第i+1行表示D_i

输出格式:

一个整数,最小的总步数

输入样例:

5 10

2

8

1

3

9

输出样例:

4

说明:

2<=N<=1500

N<=L<=1,000,000

答案保证不大于1,000,000,000

【解析】

没解析,题都不理解

【代码】

1.CS

  1: Program CS(input,output);
  2:   const Need:array['1'..'5','1'..'6']of integer=
  3: ((400,500,600,650,750,0),
  4: (1700,3000,0,0,0,0),(1250,1500,1700,2350,0,0),
  5: (2250,2750,3100,3500,4200,4750),(5750,0,0,0,0,0));
  6:   var s,tmp,MainAA,FuAA:string;
  7:       money,i,clothes,MainBB,FuBB,shanguang:longint;
  8:       Gaobao,Chaidan,Somke,Nightsight:boolean;
  9:   Procedure Main;
 10:     begin
 11:       tmp:='';tmp:=tmp+'B'+s[i+1]+s[i+2];
 12:       if(money>=Need[s[i+1],s[i+2]])and(MainAA<>tmp)then
 13:         begin
 14:           dec(money,Need[s[i+1],s[i+2]]);
 15:           MainAA:=tmp;
 16:           MainBB:=0;
 17:         end;
 18:     end;
 19:   Procedure Fu;
 20:     begin
 21:       tmp:='';tmp:=tmp+'B'+s[i+1]+s[i+2];
 22:       if(money>=Need[s[i+1],s[i+2]])and(FuAA<>tmp)then
 23:         begin
 24:           dec(money,Need[s[i+1],s[i+2]]);
 25:           FuAA:=tmp;
 26:           FuBB:=0;
 27:         end;
 28:     end;
 29:   Procedure MainB;
 30:     begin
 31:       if(MainBB<5)and(MainAA<>'')and(money>=50)then
 32:         begin
 33:           inc(MainBB);
 34:           dec(money,50);
 35:         end;
 36:     end;
 37:   Procedure FuB;
 38:     begin
 39:       if(FuBB<5)and(money>=25)then
 40:         begin
 41:           inc(FuBB);
 42:           dec(money,25);
 43:         end;
 44:     end;
 45:   Procedure Extra;
 46:     begin
 47:       case S[i+2] of
 48:         '1' : if(Clothes=0)and(money>=650)then begin dec(money,650);clothes:=1;end;
 49:         '2' : if(Clothes<>2)and(money>=1000)then begin dec(money,1000);clothes:=2;end;
 50:         '3' : if(Shanguang<2)and(money>=200)then begin dec(money,200);inc(Shanguang);end;
 51:         '4' : if(not Gaobao)and(money>=300)then begin dec(money,300);Gaobao:=true;end;
 52:         '5' : if(not Somke)and(money>=300)then begin dec(money,300);Somke:=true;end;
 53:         '6' : if(not Chaidan)and(money>=200)then begin dec(money,200);Chaidan:=true;end;
 54:         '7' : if(not Nightsight)and(money>=1250)then begin dec(money,1250);Nightsight:=true;end;
 55:         '8' : if(money>=2200)and(MainAA<>'B88')then
 56:                   begin
 57:                     dec(money,2200);
 58:                     MainAA:='B88';
 59:                   end;
 60:       end;
 61:     end;
 62:   begin
 63:     assign(input,'cs.in');reset(input);
 64:     assign(output,'cs.out');rewrite(output);
 65:     readln(money);readln(s);MainAA:='';FuAA:='B12';
 66:     MainBB:=0;FuBB:=0;Clothes:=0;Shanguang:=0;Gaobao:=false;Somke:=false;Chaidan:=false;Nightsight:=false;
 67:     i:=1;
 68:     while i<=length(s) do
 69:       begin
 70:         if s[i]='B' then
 71:           begin
 72:             if s[i+2]='B' then
 73:               begin
 74:                 case s[i+1] of
 75:                   '6' : MainB;
 76:                   '7' : FuB;
 77:                 end;
 78:                 inc(i);
 79:               end else
 80:             if s[i+3]='B' then
 81:               begin
 82:                 case s[i+1] of
 83:                   '1' : Fu;
 84:                   '2','3','4','5' : Main;
 85:                   '8' : Extra;
 86:                 end;
 87:                 inc(i);inc(i);
 88:               end;
 89:           end;
 90:         inc(i);
 91:       end;
 92:     for i:=length(s) downto 1 do if s[i]='B' then break;
 93:     if length(s)-i=1 then
 94:       case s[i+1] of
 95:                   '6' : MainB;
 96:                   '7' : FuB;
 97:       end            else
 98:       case s[i+1] of
 99:                   '1' : Fu;
100:                   '2','3','4','5' : Main;
101:                   '8' : Extra;
102:       end;
103:     writeln(money);
104:     if MainAA<>'' then writeln(MainAA,' ',MainBB) else writeln('empty');
105:     if FuAA<>'' then writeln(FuAA,' ',FuBB) else writeln('empty');
106:     case clothes of
107:       1 : write('B81');
108:       2 : write('B82');
109:     end;
110:     case Shanguang of
111:       1 : write('B83');
112:       2 : begin write('B83');write('B83');end;
113:     end;
114:     if Gaobao then write('B84');
115:     if Somke then write('B85');
116:     if Chaidan then write('B86');
117:     if NightSight then write('B87');
118:     close(input);
119:     close(output);
120:   end.

2.CDgame

  1: Program CDGame(input,output);
  2:   var F:array[0..1000000]of boolean;
  3:       max,min:array[0..1000000]of integer;
  4:       G,k,n,i,j:longint;
  5:   begin
  6:     assign(input,'cdgame.in');reset(input);
  7:     assign(output,'cdgame.out');rewrite(output);
  8:     readln(G);
  9:     fillchar(f,sizeof(f),true);
 10:     F[0]:=false;for i:=1 to 9 do F[i]:=true;
 11:     for i:=1 to 9 do begin max[i]:=i;min[i]:=i;end;
 12:     for i:=10 to 1000000 do
 13:       begin
 14:         j:=i mod 10;
 15:         if j>max[i div 10] then max[i]:=j else max[i]:=max[i div 10];
 16:         min[i]:=min[i div 10];
 17:         if j>0 then
 18:         if j<min[i] then min[i]:=j else min[i]:=min[i];
 19:         F[i]:=(not F[i-max[i]])or(not F[i-min[i]]);
 20:        end;
 21:     for i:=1 to G do 
 22:       begin
 23:         readln(n);if F[n] then writeln('hy') else writeln('ymq');
 24:       end;
 25:     close(input);
 26:     close(output);
 27:   end.

3.Tuolaji

   1: #include<cstdio>
   2: double Cnm,C2,C3,ANS;
   3: int n,m,k;
   4: double Count(int n,int m)
   5: {    double R=1;
   6:     for(int i=1;i<=m;i++)R=R*(n-m+i)/i;
   7:     return R;
   8: }
   9: int main()
  10: {    freopen("tuolaji.in","r",stdin);
  11:     freopen("tuolaji.out","w",stdout);
  12:     scanf("%d%d%d",&n,&m,&k);
  13:     if(m+k>n)printf("1\n");
  14:     else{    Cnm=Count(n,m);
  15:             C2=Count(n-k,m);
  16:             C3=Count(n-k,m-1);
  17:             ANS=(Cnm-C2-C3*k)/(Cnm-C2);
  18:             printf("%.4lf\n",ANS);
  19:         }
  20:     n--;m--;k--;
  21:     if(m+k>n)printf("1\n");
  22:     else{    Cnm=Count(n,m);
  23:             C2=Count(n-k,m);
  24:             ANS=(Cnm-C2)/Cnm;
  25:             printf("%.4lf\n",ANS);
  26:         }
  27: }

4.Sunglasses

   1: #include<cstdio>
   2: #include<cstring>
   3: #include<cstdlib>
   4: int f[2][1510],n,d[1510],L,l,i,j;
   5: int CMP(const void*a,const void*b){return *(int*)a-*(int*)b;}
   6: int MIN(int a,int b){return a<b?a:b;}
   7: int main()
   8: {    freopen("sunglasses.in","r",stdin);
   9:     freopen("sunglasses.out","w",stdout);
  10:     scanf("%d%d",&n,&L);
  11:     for(i=0;i<n;i++)scanf("%d",d+i);
  12:     l=(L-1)/(n-1);
  13:     L=(L-1)%(n-1);
  14:     qsort(d,n,sizeof(int),CMP);
  15:     memset(f[0],63,sizeof f[0]);
  16:     f[0][0]=abs(1-d[0]);
  17:     for(i=1;i<n;i++)
  18:     {    f[i&1][0]=f[!(i&1)][0]+abs(l*i+1-d[i]);
  19:         for(j=1;j<=L;j++)
  20:             f[i&1][j]=MIN(f[!(i&1)][j-1],f[!(i&1)][j])
  21:                 +abs(l*i+1+j-d[i]);
  22:     }
  23:     printf("%d\n",f[!(n&1)][L]);
  24:     fclose(stdout);
  25:     return 0;
  26: }
posted @ 2011-10-03 14:14  Loongint  阅读(805)  评论(1编辑  收藏  举报