解题思路:因为我们不清楚从哪个数字开始数能赢得最大球票,我们便进行枚举,把从每个数开始数时能得到的最大球票数找出,并和上一次的求出的最大球票数进行比较,如果更大,就进行更新,直到遍历完所有数字,此时已得到最终的最大球票数,进行输出即可

#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;
}

 

 

更多推荐