一、果壳游戏
题目描述
为了消磨时光,奶牛Bessie和她的朋友Elsie喜欢玩一种她们在农业展览会上看到的游戏。
游戏准备阶段,Bessie在桌子上放置三个倒置的坚果壳,并在其中一个坚果壳下面藏了一块小的鹅卵石(至少她希望这是一块鹅卵石——她在一块牧场的地上找到的)。随后Bessie会两两调换坚果壳,同时Elsie试着去猜鹅卵石的位置。
奶牛们在农业展览会上看到的这个游戏的标准形式是玩家可以看到鹅卵石初始的位置,然后要求玩家猜所有交换完成之后鹅卵石最终的位置。
然而,现在奶牛们想要去进行这样一种玩法,Elsie不知道鹅卵石的初始位置,同时她可以在每一次交换之后猜一下鹅卵石的位置。Bessie知道正确答案,在游戏结束后会给Elsie一个分数,等于她猜对的次数。
给定所有的交换和Elsie的猜测,但是不给出鹅卵石的初始位置,请求出Elsie最高可能获得的分数。
输入格式(文件名:shell.in):
输入的第一行包含一个整数NN,为交换的次数(1≤N≤1001≤N≤100)。
以下NN行每行描述了游戏的一个回合,包含三个整数aa、bb和gg,表示Bessie交换了坚果壳aa和bb,然后Elsie猜的是坚果壳gg。所有这三个数均为1、2、3之一,并且a≠b。
输出Elsie可以得到的最高分数。
分析:
1、看到题目的第一眼应该想结构体;
2、从1到n一个一个枚举,枚举如果果壳再第i个杯里时,她可以得多少分;
3、开bool数组便于枚举(因为要用到swap函数);
4、开计数器打擂台比较,输出最大值;
具体步骤:
1、定义结构体,输入结构体,bool数组清零;
struct guoker
{
int a;
int b;
int g;
}c[1010];
bool d[1010];
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>c[i].a>>c[i].b>>c[i].g;
d[i]=0;
}
2、双重循环枚举,比大小,输出(记得清零bool数组);
int ans=0;
int maxx=-1;
for(int j=1;j<=n;j++)
{
d[j]=1;
for(int i=1;i<=n;i++)
{
swap(d[c[i].a],d[c[i].b]);
if(d[c[i].g]==1) ans++;
else continue;
}
if(ans>maxx) maxx=ans;
for(int i=1;i<=n;i++)
{
d[i]=0;
}//因为现在不确定果子在哪个杯子里,所以要从头到尾清零
ans=0;
}
cout<<maxx;
本题建议大家先在word文档里模拟过程,这样可以更好打开思路
二、黑色星期五
题目描述:
13号又是星期五是一个不寻常的日子吗?13号在星期五比在其他日少吗?
为了回答这个问题,写一个程序来计算在n年里13日落在星期一,星期二…星期日的次数.这个测试从1900年1月1日到1900+n-1年12月31日.n是一个非负数且不大于400.
这里有一些你要知道的:
1900年1月1日是星期一.4,6,11和9月有30天.其他月份除了2月都有31天.闰年2月有29天,平年2月有28天.年份可以被4整除的为闰年(1992=4*498 所以 1992年是闰年,但是1990年不是闰年)以上规则不适合于世纪年.可以被400整除的世纪年为闰年,否则为平年.所以,1700,1800,1900和2100年是平年,而2000年是闰年.请不要预先算好数据!
输出格式
七个在一行且相分开的整数,它们代表13日是星期六,星期日,星期一…星期五的次数。
分析:
1、先开数组,存入12个月的数据;
2、开计数器等于13(因为是13号);
3、开一维数组,双重循环查找,记录数据,sum增加相关的月份的天数(读者好好理解下为什么这么做)。
具体步骤:
1、开数据;
2、输入,判断闰年;(以上两个步骤代码不再给出)
3、第二重循环计算星期几,sum增加相应的天数
for(int i=1900;i<1900+n;i++)
{
if((i%4==0 && i%100!=0) || i%400==0)
a[2]=29;
else a[2]=28;
for(int j=1;j<=12;j++)
{
b[sum%7]++;
sum+=a[j];
}//增加天数为了模拟相应的月份,不影响计算
}
4、按照题目要求的顺序输出。
cout<<b[6]<<' '<<b[0];
for(int i=1;i<=5;i++)
{
cout<<' '<<b[i];
}