1.3
赢球票
(
★
)
题目信息
2016
年国赛
-
程序设计题
✧
C/C++ C
组第
4
题
✧
Java C
组第
4
题
【问题描述】
某机构举办球票大奖赛。获奖选手有机会赢得若干张球票。
主持人拿出
N
张卡片(上面写着
1
, . . . , N
的数字),打乱顺序,排成一个圆圈。
你可以从任意一张卡片开始顺时针数数
: 1
,
2
,
3
. . .
如果数到的数字刚好和卡片上的数字相同,则把该卡片收入囊中,从下一张卡片重
新数数。
直到再无法收获任何卡片,游戏结束。囊中卡片数字的和就是赢得球票的张数。
比如卡片排列是
1 2 3
,我们从
1
号卡开始数,就把
1
号卡拿走。再从
2
号卡开始,
但数的数字无法与卡片对上,很快数字越来越大,不可能再拿走卡片了。因此这次我们
只赢得了
1
张球票。
还不算太坏!如果我们开始就傻傻地从
2
或
3
号卡片数起,那就一张卡片都拿不
到了。
如果运气好,卡片排列是
2 1 3
,那我们可以顺利拿到所有的卡片!
本题目标:已知顺时针卡片序列,随便你从哪里开始数,求最多能赢多少张球票(就
是收入囊中的卡片数字之和)。
【输入格式】
第一行一个整数
N
(
N
⩽
100)
,表示卡片数目。
第二行
N
个整数,表示顺时针排列的卡片。
【输出格式】
输出一行,一个整数,表示最好情况下能赢得多少张球票。
【样例输入】
3
1 2 3
【样例输出】
1
10
第
1
章 枚举与模拟
懒人速读
给定
n
张卡片,卡片上分别写着数字
a
1
, a
2
, . . . , a
n
。
现将这
n
张卡片围成一个圈。
我们可以从圈上任意一个位置开始顺时针数数:
1
,
2
,
3
. . .
。
若当前数到的数字和卡片上的数字相同,则将卡片取走,并从下一张卡片所在位置重新
数数:
1
,
2
,
3
. . .
。
问我们取走的卡片上的数字之和最大可以是多少
?
#include <bits/stdc++.h>
using namespace std;
int main(){
int N;
cin >> N;
int arr[N+1];
int flag[N+1];
int huo[N+1];
int i;
for(i=1;i<=N;i++){
cin >> arr[i];
flag[i]=0;
//i啊
huo[i]=0;
}
//int max;
int jiajia=0;
int pai_num;
int j;
for(i=1;i<=N;i++){
jiajia=0;
int start_index=i;
j=1;
pai_num=N;
//没有对flag进行初始化
for(j=1;j<=N;j++){
flag[j]=0;
}
while(jiajia<=N&&pai_num>0){
if(flag[start_index]==0){
jiajia++;
//cout << jiajia << endl;
if(arr[start_index]==jiajia){
flag[start_index]=1;
pai_num--;
//注意获取的数目是卡片上的数字的合而不是卡片的数字
huo[i]+=arr[start_index];
//cout <<"获得" <<huo[i] <<endl;
jiajia=0;
}else{
//注意这是在else里面啊
start_index++;
if(start_index==N+1){
start_index=1;
}
}
}else{
start_index++;
if(start_index==N+1){
start_index=1;
}
}
}
}
int max=0;
for(i=1;i<=N;i++){
if(max<huo[i]){
max=huo[i];
}
}
cout << max;
}