蓝桥杯2016年国赛C/C++C组第4题 赢球票
·

解题思路:因为我们不清楚从哪个数字开始数能赢得最大球票,我们便进行枚举,把从每个数开始数时能得到的最大球票数找出,并和上一次的求出的最大球票数进行比较,如果更大,就进行更新,直到遍历完所有数字,此时已得到最终的最大球票数,进行输出即可
#include<stdio.h>
int main()
{
int a[101]={0},flag[101]={0};//a数组用于存放卡片数字号,flag数组用于模拟判断卡片是否被取走
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++)//
{
scanf("%d",&a[i]);完成卡片数字号的存放
}
int ans=0;//用于输出最终赢得的最大球票数
for(int i=1;i<=n;i++)
{
for(int j=1;j<=n;j++) flag[j]=0;//从每个数字开始枚举时,先初始化flag数组,表示所有卡片都未
//num表示所数的数,sum用于对赢得的球票进行求和,cnt记录所取的卡片张数 //被取走
//pos用于模拟卡片位置
int num=1,sum=0,cnt=0,pos=i;
while(1)
{
if(cnt==n||num>n) break;//判断游戏结束条件,即取走所有卡片或数出的数>n(那就不可能取出卡片)
if(flag[pos]==1)//如果当前卡片被标记为1,跳过当前卡片,移动到下一位置 //游戏结束
{
if(pos==n) pos=1;//如果当前卡片为末尾位置,它的下一张卡片则为开头位置
else pos++;
continue;//跳过下面的语句判断
}
if(num==a[pos])//出现数的数和卡片上的数值相等,开始取出卡片
{
num=1;//每取出一张卡片后,重新开始数数
cnt++;//每取出一张卡片,所收获的卡片张数加1
sum+=a[pos];//取出卡片时,进行求和
flag[pos]=1;//取出卡片后,把这种卡片标记为1,下次遍历到它时,即可跳过
if(pos==n) pos=1;//每取出一张卡片,卡片位置移动到下一位,如果为末尾则移动到开头
else pos++;
}
else
{
num++;//若数的数和卡片上的数值不相等,则开始数更大的数
if(pos==n) pos=1;//同时卡片位置移动到下一位,如果为末尾则移动到开头
else pos++;
}
}//while循环结束后,这一轮枚举出的最大球票数已被找出,然后判断是否需要更新
if(sum>ans) ans=sum;//更新赢得的最大球票数
}
printf("%d\n",ans);//经过从1到n张卡片的所有轮枚举后,此时最大球票数即为结果,完成输出
return 0;
}

更多推荐

所有评论(0)