【题解】游戏
【题目描述】
上了半天的物理数学课,大家的脑子有点转不动了,下午的课表似乎看透了同学们的 心思,第一节就安排了体育课,CZ 中学的课表真是太有爱了,赞一个!午间休息后,文体 委员小 S 喊大家到教室外的走廊上排队,队形整好后小 S 带着大家走到了大操场上,体育 老师早就在那等着了,他先安排同学们做了五分钟的准备活动,接下来让大家玩一个有趣 的游戏,在这个游戏里,全班同学先散开站在操场上,同学们轮流玩这个游戏,从 1 号同学开始,然后是 2 号 3 号等等 (只要这个同学仍然参与这个游戏)。每次轮到玩的同学,就选择一个目前离他最近的同学,走过去拍他一下,然后回到原来的位置,那个被拍到的 同学就被排除在游戏之外了,必须立刻离开操场。当操场上只剩下一个同学时,游戏即告 结束,最后站在操场上的那个同学就是赢家。
R 老师 正和隔壁班的 F 主任津津有味地在场边看着同学们做游戏,为了添加一点乐 趣,R 老师就和 F 主任打赌哪个同学会赢?所以他想事先知道谁是赢家。R 老师希望你写 一个程序,读入同学们相互之间的距离,模拟出哪个同学最终会获胜。
【输入描述】
输入数据第一行为一个正整数 N, 表示在操场上玩游戏的人数,其中 1≤N≤1000, 接下来共有 N 行数据,每行有 N 个用空格隔开的整数,其中第 i 行第 j 列的数据表示操场 上编号为 i 的同学与编号为 j 的同学之间的距离。输入数据保证第 i 行第 i 列(主对角线 上的位置)的数据均为 0,其余数据均为正整数,且第 i 行第 j 列的数据一定等于第 j 行 第 i 列的数据,这意味着同学甲到同学乙的距离等于同学乙到同学甲的距离;操场上任意 两对同学之间的距离均不相同,也就是说上三角部分的正整数互不相同。
【输出描述】
输出数据仅有一行包含一个正整数表示获胜的同学的编号。
【样例输入】
4
0 1 6 3
1 0 4 5
6 4 0 2
3 5 2 0
【样例输出】
1
【样例解释】
1号同学先玩,走过去拍了离他最近的2号同学,2号同学被排除出游戏;接下去就直接轮到3号同学玩了,他走过去拍了4号同学,4号同学被排除出游戏;再次轮到1号同学时,他走过去拍了3号同学,3号同学被排除出游戏。最后1号同学获胜。
【数据范围】
30%的数据满足:n≤10
60%的数据满足:n≤100
100%的数据满足:n≤1000,所有数据不超过长整型范围
【参考代码】
#include<bits/stdc++.h> using namespace std; long long n,a[1055][1055]; bool f[10000]; int main(){ memset(f,true,sizeof(f)); cin>>n; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) { cin>>a[i][j]; } } long long p=0; while(p<n-1) { for(int i=1;i<=n;i++) { if(f[i]==true) { long long s=INT_MAX/2,ss; for(int j=1;j<=n;j++) { if(a[i][j]<s&&f[j]==true&&i!=j) { s=a[i][j]; ss=j; } } f[ss]=false; p++; } } } for(int i=1;i<=n;i++) { if(f[i]==true) { cout<<i; exit(0); } } return 0; }
(adsbygoogle = window.adsbygoogle || []).push({});