问题1. 题目给定的是一个环(圆圈),我们需要如何模拟在环上的移动呢?
问题2. 如何表示被拿走的卡片呢?
问题3. 从哪个位置(起点)开始数数能拿走最多的卡片呢?
问题4. 游戏什么时候会结束呢?
对于问题1: 对于在序列上的移动,如果想从当前位置顺时针移动到下一个位置,只要让下标+1即 可。但当处于第n个位置时,由于没有第n+1个位置,所以无法移动。而对于环,第n+1 个位置即第1个位置,所以从第n个位置移动到下一个位置只要让下标为1即可,其他位置 的移动和序列相同。
对于问题2: 可以对被拿走的卡片打上标记。定义flag[],其中flag[i]表示第i张是否被取走(flag[i]=1 表示被取走,flag[i]=0 表示没有被取走)。下图展示了第2张卡片被拿走的情况。
对于问题3: 不知道。既然不知道,就将每个位置都作为一次起点并模拟整个过程,再从中选出最大 的卡片和(即答案)。
对于问题4: 游戏结束分为以下两种情况。 取走所有的卡片(即取走n张卡片)。 当前数的数大于n(不可能再取走卡片了)。
#include<stdio.h>
int n;
int arr[100],flag[100];
int main()
{
scanf("%d",&n);
int i = 0;
for(i=1;i<=n;i++)
{
scanf("%d",&arr[i]);//空格会导致输入读取不正确
}
int ans = 0;
for(i=1;i<=n;i++)//枚举从不同位置开始数的情况
{
int j = 0;
for(j=1;j<=n;j++)
{
flag[j] = 0;//flag[i]为1时表示已被选走
}
int num,pos,sum,count;
pos = i;
num = 1;
sum = 0;
count = 0;
while(1)
{
if(num>n||count==n)break;
if(flag[pos]) //如果该卡片已被取走,则移动到下一个位置
{
if(pos == n)pos = 1;//拆环成链
else pos++;
continue;
}
if(num==arr[pos]) //数的值和当前位置卡片的值相同时取走该卡片
{
flag[pos] = 1;
num = 1;
sum = sum + arr[pos];
count++;
if(pos==n)pos = 1;
else pos++;
}
else
{
num++;
if(pos==n)pos = 1;
else pos++;
}
}
if(sum>ans)ans = sum;
}
printf("%d\n",ans);
return 0;
}