SCNU 2015ACM新生赛初赛【1001~1011】个人解题思路
题目1001:
大意:已知$n$个角色,$m$种怪物种族,$k$个怪物,给出一组角色编号,编号$P_{i}$的角色能肝死编号$i$的怪物,对于给定的一组怪物编号,为了打通关,求切换角色的次数。另外初始默认第$1$个角色上场。
思路:模拟水题,没啥好说的,先随便弄个数组比如叫$monitors$,于是$monitors[i] = P_{i}$,然后去肝那群怪,初始变量$actor = 1$,循环每次读一个怪物编号$x$,如果$monitors[x]
eq actor$,说明当前角色$actor$并不能肝死这只编号$x$的怪,切换次数$count + 1$,当前角色$actor$改为$monitors[x]$,然后就下一次循环了。
非官方代码:
1001
1 #include <stdio.h> 2 3 int main() 4 { 5 int T, n, m, k, act[101]; 6 scanf("%d", &T); 7 while(T--) { 8 scanf("%d%d%d", &n, &m, &k); 9 for(int i=1; i<=m; i++) 10 scanf("%d", act+i); 11 int t=1, x, res=0; 12 for(int i=0; i<k; i++) { 13 scanf("%d", &x); 14 if(t!=act[x]) { 15 t=act[x]; 16 ++res; 17 } 18 } 19 printf("%d ", res); 20 } 21 return 0; 22 }
题目1002:
大意:自己理解吧,懒得打了。
思路:在给定的$n imes m$矩阵里,行代表角色,列代表怪物,对应元素就是该行角色打败该列怪物所需时间,那就找出每列的最小值,最后根据怪物编号累加一下时间即可。拿一维数组就够了,读入的同时求最小值,因此不用保存二维的信息。
非官方代码:
1 #include <stdio.h> 2 3 int main() 4 { 5 int T, n, m, k, tme[101], t; 6 scanf("%d", &T); 7 while(T--) { 8 scanf("%d%d%d", &n, &m, &k); 9 for(int i=1; i<=m; i++) 10 scanf("%d", tme+i); 11 for(int i=1; i<n; i++) 12 for(int j=1; j<=m; j++) { 13 scanf("%d", &t); 14 if(tme[j]>t) 15 tme[j]=t; 16 } 17 int res=0; 18 for(int i=0; i<k; i++) 19 scanf("%d", &t), 20 res+=tme[t]; 21 printf("%d ", res); 22 } 23 return 0; 24 }