第十届“北大青鸟”杯浙江师范大学程序设计竞赛解题报告
(罗方炜,lfw2565295@126 ,浙师大10计软)
比赛概述
首先是本届比赛的题目:总共11题
本次比赛的提交统计:
其中A,C,K相对简单,B,D,F为中等题,E,G,H为稍难题,I,J没人解出
本次比赛前十名的情况:
有两名同学成功解出8道,还有1名同学解出7道,6道的有些数量,同时恭喜前6名获得本次比赛的一等奖,同时前十名获得比赛奖品——T恤。
题目讲解
A:Yes Or No
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 596 | Accepted: 94 | |||
Description
在二维平面上有两点P1(x1,y1),P2(x2,y2),现今,P1想向P2靠拢,但只能往斜上方走(x1+1,y1+1),或往斜下方走(x1+1,y1-1)。
请问P1能否抵达P2,如果可以输出Yes,否则输出No。
请问P1能否抵达P2,如果可以输出Yes,否则输出No。
Input
第一行为一个正整数t(t<=100),代表测试组数。每一组测试数据:
一行有四个整数x1,y1,x2,y2。(各数值均大于等于0且小于等于100000)
一行有四个整数x1,y1,x2,y2。(各数值均大于等于0且小于等于100000)
Output
对于每一组测试数据,输出一行结果:
如果P1能够抵达P2,输出Yes
否则,输出No
如果P1能够抵达P2,输出Yes
否则,输出No
Sample Input
3
0 0 1 1
0 0 2 0
0 0 3 0
Sample Output
Yes
Yes
No
Hint
没忘记初中方程组就秒了这题拿下Second Blood吧~
思路:
此题被作为简单题,意思是从一个点A要走到另外一个点B是否可行,而行走的办法只能是两种,即从(x,y)点出发,下一步只能到(x+1,y+1)(*)或者(x+1,y-1)(**),这可以设一个方程,设(*)走了a次,(**)走了b次,那么联立以后就是x1+a+b=x2;y1+a-b=y2;那么方程就是求是否有a>=0和b>=0满足这个方程组,很多同学卡在这题是因为根本没有想到这个方法。
参考代码:
#include<stdio.h>
#include<string.h>
int x1,y1,x2,y2;
int main()
{
int t,n;
scanf("%d",&t);
while(t--){
scanf("%d%d%d%d",&x1,&y1,&x2,&y2);
n=x2-x1+y2-y1;
if(n%2==1){
printf("No\n");
}else{
n/=2;
if(n>=0&&n<=x2-x1){
printf("Yes\n");
}else printf("No\n");
}
}
return 0;
}
B:勇士出征
Time Limit: 1000MS | Memory Limit: 65536K | |||
Total Submissions: 144 | Accepted: 43 | |||
Description
一个神奇的梦,把你带到了三国时代,你变成了蜀国的大将。正是蜀魏对阵之时,刘备召集部下,欲派出勇士与敌军大将单挑,现在蜀国大将们排成一纵队,由刘备亲检查队首的这名大将是否可以出战,判断的原则是:如果队首的这名大将的战斗力是当前队列中最强的,则
由他出战,否则他将会被掉到队列的尾部,出战过的大将不会在回到出战的队列中,由于蜀国大将甚多,你现在最关心的就是你是第几个出战的。
Input
第一行一个整数case(case <= 100),表示测试数据的组数。
对于每组测试数据,第一行两个整数,N和K,表示当前队伍中的人数和你所在的位置。
接下来N个数,表示表示队伍中每个大将的战斗力。
(0 < N <= 100,0 < K <= N)
对于每组测试数据,第一行两个整数,N和K,表示当前队伍中的人数和你所在的位置。
接下来N个数,表示表示队伍中每个大将的战斗力。
(0 < N <= 100,0 < K <= N)
Output
对于每组测试数据输出一个整数,表示你是第几个出战的。
Sample Input
3
1 1
5
4 3
1 2 3 4
6 1
1 1 9 1 1 1
Sample Output
1
2
5
思路:
此题比较简单,用队列直接模拟即可,对于队首元素,判断队列中是否有元素比它大,有比它大的,就把它放到队尾,如果没有,就直接出队列。用数组写起来会很方便,可用两个变量L,H 表示队首和队尾下标。
此题考察的是大家是否能模拟整个队列循环的过程,只要在程序的写法上注意点小小的优化还是比较简单的,可能很多同学不知道队列的知识,需要参考数据结构里的知识。
参考代码:
#include<stdio.h>
#define M 105
struct node {
int num, id;
} Q[M*M];
int main() {
int cas, i, k, L, R, my;
scanf("%d", &cas);
while (cas-- && scanf("%d %d", &R, &my)) {
for (i = 1; i <= R; i++) {
scanf("%d", &Q[i].num);
Q[i].id = i;
}
L = 1;
int cnt = 1;
while (L <= R) {
k = L;
for (i = L + 1; i <= R; i++)
if (Q[i].num > Q[k].num)k = i;
if (Q[k].id == my)break;
cnt++;
for (i = L; i < k; i++)wa字符串是什么
Q[++R] = Q[i];
L = k + 1;
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论