BNUZ-ACM 2018国庆新生欢乐赛部分题解+思路(已解出答案部分)
由于时间不足,本人在新生赛仅浏览了四题,其中两题完全通过。
下面是已解出的一题,供比对和取优。
A. 三角恋
下面贴上原题:
我的思路: 首先需要一个while(scanf)循环,以供测试器循环测试各组数据。然后因为需要输入T组数据,所以还需要一个if循环或者while循环。数据的输入也需要利用到到数组,比如a[i]。再者,输出时需要判断是第几次输出,输出一个可自增的量(%d,c++)。最后,需要一个判断if以决定输出嘤嘤嘤还是苦海无涯。
贴上我的代码,我们把它叫做代码a:
#include<stdio.h>
int main(){int a,b=0,c,d,i;while(scanf("%d",&a) !=EOF){ while(a--){int g=0;b++;scanf("%d",&c);int d[c+1];for(i=1;i<=c;i++){scanf("%d",&d[i]);}int f=0;while(c--){f++;if(d[d[d[f]]]==f){printf("Case #%d: 苦海无涯\n",b);g=1; break;} }if(g==0){printf("Case #%d: 嘤嘤嘤\n",b); }}}return 0;
}
出题者提供的代码,我们把它叫做代码b:
#include<stdio.h>
int main() {int T, n;int a[5005];scanf("%d", &T);int cas = 1;while(T--) {scanf("%d", &n);int flag = 0;for(int i = 1; i <= n; i++) {scanf("%d", &a[i]);}for(int i = 1; i <= n; i++) {if(a[a[a[i]]] == i){flag = 1;break;}}if(flag){printf("Case #%d: 苦海无涯\n",cas++);}else {printf("Case #%d: 嘤嘤嘤\n",cas++);}}return 0;
}
在这里对比一下两段代码,以及写一下他们所用到的知识。
输入阶段:
代码a:
while(scanf("%d",&a) !=EOF){ //输入一个数字,决定总程序要循环多少次while(a--){ //while(0)为结束int g=0;b++; //b代表是第几次循环,决定输出case几scanf("%d",&c); //输入一个数字代表人数int d[c+1]; //定义数组,输入数字的值决定了要定义多少个数组for(i = 1; i <= c; i++)scanf("%d",&d[i]); //循环给数组赋值,直到结束}}
代码b:
int a[5005]; //直接定义5005个数组scanf("%d", &T);while(T--) { //同样循环T次scanf("%d", &n);int flag = 0;for(int i = 1; i <= n; i++) { //循环赋值scanf("%d", &a[i]);}
这两段代码的区别在于a代码没有直接定义数组的个数,b直接定义了有5005个数字,根据题目来看,其实两种方法都可以。
while(0)代表while(false)程序将不执行,当while里面的值仍然是非零数的时候,程序会继续循环。
计算判断阶段:
代码a:
int f=0; //每次循环先将f定义为0,以方便后面判断while(c--){f++; //每次循环自增,判断各人是否符合条件if(d[d[d[f]]]==f){printf("Case #%d: 苦海无涯\n",b);g=1; //g=1是为了跳过下方嘤嘤嘤的判断break; //跳出语句,不必要重复执行,减少运行时间} }if(g==0) //如果不曾有过进入上方的if,则会输出嘤嘤嘤printf("Case #%d: 嘤嘤嘤\n",b);
代码b:
int cas = 1;for(int i = 1; i <= n; i++) {if(a[a[a[i]]] == i){flag = 1;break;}}if(flag){ //if(flag),flag为真时,也就是等于1时进入苦海无涯printf("Case #%d: 苦海无涯\n",cas++); //cas自增,由于两种情况都会输出cas,所以没有问题}else {printf("Case #%d: 嘤嘤嘤\n",cas++);}}
在这里讲一下,为什么是a[a[a[i]]] == i呢
我们假设有一个数组是:
1 | 2 | 3 | 4 |
---|---|---|---|
3 | 1 | 2 | 2 |
在这个数组里面,很明显是有三角恋的,因为1喜欢3,3喜欢2,2喜欢1。
我们把数组看成是一种函数:
x | 1 | 2 | 3 |
---|---|---|---|
f(x) | 3 | 1 | 2 |
那么这个表格就可以变成:
x | 1 | f(f(1)) | f(1) |
---|---|---|---|
f(x) | f(1) | f(f(f(1))) | f(f(1)) |
那么问题就变成了f(f(f(1)))是不是等于1的问题了,同样可以推理出可以变成f(f(f(x)))是不是等于x的问题。
代码部分分为两种方式,个人认为第二种方法更好。代码b减少了嵌套,将函数功能模块化,便于维护与理解。同时,有良好的代码习惯作为基础,这些都是我需要学习的。目前来看,我应该在代码的整洁性以及规范性上面下一些功夫。
出题者代码摘自:https://blog.csdn.net/anthony1314/article/details/82926950
感谢bnuz-acm协会为我们举行的国庆欢乐赛,感谢参与了欢乐赛的老师及同学们,希望acm协会能越办越好。
BNUZ-ACM 2018国庆新生欢乐赛部分题解+思路(已解出答案部分)相关推荐
- BNUZ-ACM 2018国庆新生欢乐赛题解
目录 A.三角恋 B.台风闲聊 C.kuyee买奶茶 D.法师Knight可能很强大 E.看我一只穿云箭 F. 兔叽先生和长颈鹿女士 G.面积面积 H.所有人!都别过来! I.Everduo与星澈的合 ...
- BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑(题目详解+代码)
原题链接:BNUZ-ACM 2019 E.如风般奔跑 BNUZ-ACM 2019国庆新生欢乐赛 E.如风般奔跑 题目 题目大意 这题题目的大意是:给你一个800米的环形跑道以及小陈和小张的速度,问你什 ...
- 2021年美赛A题思路详解
2021年数模美赛A题思路详解 题目分析 思路详解 由于和队友思路不一致,导致最后我的思路只算了前两问,而后几问用了我认为离题的PCA(主成分分析)的方法,我的建模思路没有得到完全实现,总体情况很不满 ...
- 学计算机专业准备什么电脑,大一新生有必要带电脑吗?辅导员说出答案,报道前需要了解清楚...
文/东动 天赋的力量大于教育的力量 进入到大学后,大一新生难免要准备一些自己的日常用品,比如生活用品,换洗衣服,还有一些床单被褥等等.同样也有很多关于学习方面的物品需要准备,比如电脑. 对于这种现象, ...
- BUU-ACM国庆新人欢乐赛题解
A 模拟签到题 判断平年还是闰年,然后输出365.366即可. code #include <stdio.h> int main() {int x;scanf("%d" ...
- 2018大一新生联考上机题解
A.上去揍ta ~_~(由某acm队员的渗透一班zj) 这道题是比赛第一题,对一些有代码基础的人来说算是比较简单,没有坑点,下面是AC代码 #include <stdio.h> #incl ...
- 暑假爆零欢乐赛SRM08题解
这真的是披着CF外衣的OI赛制?我怎么觉得这是披着部分分外衣的CF?果然每逢cf赛制必掉rating,还是得%%%cyc橙名爷++rp.. A题就是找一找序列里有没有两个连在一起的0或1,并且不能向两 ...
- ACM—TC 联合招新赛1题解
本场题目难度较上场有所增加,思维量较大,但是涉及的知识点都已经提及(都可写. A.签到题 难度指数:3 这题我本来想放在上一场当防AK题,但是觉得太简单了又放这场当篇难题了. 解题思路:首先简化问题, ...
- 2021年高教杯数学建模国赛C题思路详解
已更新 C 题 生产企业原材料的订购与运输 某建筑和装饰板材的生产企业所用原材料主要是木质纤维和其他植物素纤维材料, 总体可分为A,B,C 三种类型.该企业每年按 48 周安排生产,需要提前制定 24 ...
最新文章
- acwing单源最短路的建图模式总结
- 深入理解分布式技术 - 服务注册与发现背后的逻辑
- 并查集 - 交换字符串中的元素
- 一个给计算机写程序的人是谁,如果计算机是中国人发明的 写代码会是一种什么情况 程序员看了都头疼...
- (03)FPGA与CPLD区别
- 2022-01-12总结 CSS开篇
- 详解:CDH预警配置 QQ邮箱 与 企业实操
- 【深度优先搜索】计蒜客:方程的解数
- 云计算能给你带来什么?
- 庖丁解牛之spring源码系列一
- LightningChart 实际应用案例-Polymer Char
- rds mysql 导出数据文件_rds数据库导出
- 中国计算机软件专业技术资格和水平考试各地咨询地址和报名时间
- php版本微信公众号开发
- 穷养儿富养女 很多人都不知道这句话的真正含义
- 模型选择准则之AIC和BIC
- 2022高处安装、维护、拆除考试模拟100题及模拟考试
- 网站日访问量,在线用户数,等如何统计?
- 如何识别64位和32位CPU
- 主祷文第二、第三条求什么