解题思路:设立一个数组当作人数,将他们初始化为0当作特征值,然后利用for循环和一个小技巧(i=(++i)%n)不断遍历数组,
for (i=0; i<n; i=(++i)%n)
再利用count计数,每当计数到3时改变特征值,并同时让计数归零重新计数,还有count2来计数总选出人数,
int count = 0; int count2 = 0; if (s[i] == 0){ if (count2 == n-1){ printf("%d", i+1); break; } count++; if (count == 3){ s[i] = 1; count = 0; count2++; } }
这样不断的循环下去之后能一直排除出每计数为3时的人,相对应count2也会增加计数,
直到count2等于总人数-1时我们就知道最后的那个人就是我们所需要的那个人,而由于是用数组下标来做的顺序编号,所以最后输出时要用i+1.
if (count2 == n-1){ printf("%d", i+1); break; }
注意事项:
(1)小技巧:i=(++i)%n; //这样子可以让i不断地从0到n-1,当++i=n时i会回退至0.
for (i=0; i<n; i=(++i)%n)
(2)数组地初始化:之前我一直把1作为数组地初始值,即会写出s[100] = {1};这样地句子,很明显这是想当然了,后来就直接用了0当作初始值,因为若用1,要遍历赋值初始化,而0就只是s[100] = {0};就搞定。
int s[100] = {0};
(3)最后面的输出,因为i时数组下标,所以最后输出时要加1.
printf("%d", i+1);
参考代码:
#include <stdio.h> int main(int argc, char const *argv[]) { int n; scanf("%d" ,&n); int s[100] = {0}; int count = 0; int count2 = 0; int i; for (i=0; i<n; i=(++i)%n){ if (s[i] == 0){ if (count2 == n-1){ printf("%d", i+1); break; } count++; if (count == 3){ s[i] = 1; count = 0; count2++; } } } return 0; }
补充:数组的大小可以用malloc函数来帮助实现建立s[n]这种骚操作,本人因为还不熟悉malloc,所以没有用上,欢迎会的大神们指点一下。
(本文可能还有很多的下瑕疵,欢迎大家评论,指出和纠正,谢谢)
(喜欢的同学不妨评论一下或者点个赞噢~)
0.0分
2 人评分
C语言网提供由在职研发工程师或ACM蓝桥杯竞赛优秀选手录制的视频教程,并配有习题和答疑,点击了解:
一点编程也不会写的:零基础C语言学练课程
解决困扰你多年的C语言疑难杂症特性的C语言进阶课程
从零到写出一个爬虫的Python编程课程
只会语法写不出代码?手把手带你写100个编程真题的编程百练课程
信息学奥赛或C++选手的 必学C++课程
蓝桥杯ACM、信息学奥赛的必学课程:算法竞赛课入门课程
手把手讲解近五年真题的蓝桥杯辅导课程
发表评论 取消回复