游戏棋
TimeLimit: 1000MS MemoryLimit: 32768 Kb
Description
相信大家都听说过大富翁这个游戏,一个不断进行色子抛出和买卖的格子游戏。在这个游戏中我们可以对于自己财产进行买卖。并且按照自己策略不断积攒财富。而且,在不同的地方对于玩家还有相应的惩罚机制。这都给这个游戏带来了极大的趣味性。
郑州大学ACM实验室中最近这个游戏相当之流行。可以说大富翁的重要程度已经仅仅排在了训练的后面。但是网络中所能提供的地图是有限的,所以实验室的同学玩的时间长了之后就感觉非常的无聊。可恶的开发团队并没有给出地图设计软件。这个让整个实验室的同学很纠结。所以他们最终决定自己开发一套自己的大富翁游戏软件。在这个游戏的内部测试版本中,色子的功能被取消。每次一个人向前走一步。并且按照设定好的方式进行游戏。
在整个过程中我们只有一种商品:房子。而且在整个过程中只有4种操作,分别是价格上升,价格下降,买房子,卖掉所有的房子。在游戏开始的时候我们会给予你一定的启动资金。
当你的资产大于原来的二倍的时候。(包括你的现金和房子数量乘以当前的价格,也就是说房子即使不卖出,也可以算做资产的部分)你就赢得了游戏。如果你的资产在某个时刻达到了原来的1/2之下。那么你将失败。如果你在300次操作过程内没有结束游戏,那么就说明游戏本身设计的是有问题的。毕竟我们不能让我们的ACMer们过于沉迷于此。而且因为游戏是前期产品,如果游戏要求你买的房子超过你的现有资金或者要求你卖出的房子超过你的现有的房子的数量。那么游戏将直接报错。
Input
输入分两部分:
第一部分有一个整数T(1<=T<=10)表示测试组数。
第二部分共T组,对于每组数据:
第一行有三个数字X,Y和Z,表示整个游戏棋的大小,房子的初始价格,以及你的初始资产0 < N < 100,0 < Y < 50 , 5 < Z < 1000。
第二行到第N + 1行是N个格子中的内容。你将顺次从第一个格子走到最后一个,然后再从第一个开始。四种内容别是"price_up x","price_down x ","sell x houses","buy x houses."其分别表示房子的价格上升x元,房子的价格下降x元,卖掉x个房子,买入x个房子。
Output
如果你在300步之内赢得比赛那么输出"win",如果你在300步之内输掉了比赛,那么输出"lose",如果你走到了第301步,那么直接输出"bad game"。
如果游戏报错了,则直接输出"error"
Sample Input
1
4 3 100
buy 30 houses
price_up 1000
sell 30 houses
price_down 100
Sample Output
win
Hint
thanks somebody
模拟题。
第二道A的题。
回想赛场,海轮给我说的这个题,我没有多看题目,就开始敲,开始按我的想法一厢情愿地敲!后果惨重。后认真读题,删改,哎。下次一定要完全理解题意后再敲。
开始脑子是一团糟的,后来迷迷糊糊给A了,脑子还是不够清楚。
昨天重写这道题,脑子里思路很清晰,很很清晰,敲得很快,呵呵。
这道题很锻炼人的思路呀,看能不能把自己想的实现出来,呵呵。
几个步骤,房价上升,下降,买房子,卖房子。
如果总资产(房子数*当前房价+剩余钱数)为原来的二倍以上就win,原来二分之一一下,输出lose。
如果300回合后还没win or lose,输出 bad game。
#include <stdio.h> #include <stdlib.h> #include <iostream> #include <string.h> using namespace std; typedef struct{ // Struct is gelivable . I should try to like to use it. = =.. int flag; // flag the length. To distinguish the operation. int bnum,snum,upp,downp; // meaning the buy houses' num and so on .. }S; S step[110]; int main(void) { int ncases,n; char str[15],house[15]; int hnum,hprice,money; // houses'num houses' price scanf("%d",&ncases); while( ncases-- ) { scanf("%d%d%d",&n,&hprice,&money); int save = money; // save the initial money. hnum = 0; for(int i=0; i<n; i++) { scanf("%s",str); int len = strlen(str); if( len == 3 ) { step[i].flag = 3; scanf("%d %s",&step[i].bnum,house); continue; } if( len == 4 ) { step[i].flag = 4; scanf("%d %s",&step[i].snum,house); continue; } if( len == 8 ) { step[i].flag = 8; scanf("%d",&step[i].upp); continue; } if( len == 10 ) { step[i].flag = 10; scanf("%d",&step[i].downp); continue; } } int count = 0, over = 0; // count for counting ... over flag whether the game over . while( count < 300 && !over ) { if( (money + hnum*hprice)*2 < save ) // put it here is more clear. { over = 1; printf("lose/n"); continue; } if( money + hnum*hprice > save * 2 ) // so as this . { over = 1; printf("win/n"); continue; } int m = count % n; // compute the index of the operation. count++; int x = step[m].flag; if( x == 3 ) { if( money < step[m].bnum * hprice ) { over = 1; printf("error/n"); continue; } else { money -= step[m].bnum * hprice; hnum += step[m].bnum; continue; } } if( x == 4 ) { if( hnum < step[m].snum ) { over = 1; printf("error/n"); continue; } else { money += step[m].snum * hprice; hnum -= step[m].snum; continue; } } if( x == 8 ) { hprice += step[m].upp; continue; } if( x == 10 ) hprice -= step[m].downp; } if( !over ) printf("bad game/n"); } return 0; }