第十届“北大青鸟”杯浙江师范大学程序设计竞赛解题报告
(罗方炜,lfw2565295@126 ,浙师大10计软)
比赛概述
首先是本届比赛的题目:总共11
本次比赛的提交统计:
其中A,C,K相对简单,B,D,F为中等题,E,G,H为稍难题,I,J没人解出
本次比赛前十名的情况:
有两名同学成功解出8道,还有1名同学解出7道,6道的有些数量,同时恭喜前6名获得本次比赛的一等奖,同时前十名获得比赛奖品——T恤。
题目讲解
AYes Or No
Time Limit: 1000MS
Memory Limit: 65536K
Total Submissions: 596
Accepted: 94
Description
在二维平面上有两点P1(x1,y1)P2(x2,y2),现今,P1想向P2靠拢,但只能往斜上方走(x1+1y1+1),或往斜下方走(x1+1,y1-1) 
请问P1能否抵达P2,如果可以输出Yes,否则输出No 
Input
第一行为一个正整数tt<=100),代表测试组数。每一组测试数据: 
一行有四个整数x1y1x2y2。(各数值均大于等于0且小于等于100000 
Output
对于每一组测试数据,输出一行结果: 
如果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>=0b>=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),表示测试数据的组数。 
对于每组测试数据,第一行两个整数,NK,表示当前队伍中的人数和你所在的位置。 
接下来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
思路:
此题比较简单,用队列直接模拟即可,对于队首元素,判断队列中是否有元素比它大,有比它大的,就把它放到队尾,如果没有,就直接出队列。用数组写起来会很方便,可用两个变量LH 表示队首和队尾下标。
此题考察的是大家是否能模拟整个队列循环的过程,只要在程序的写法上注意点小小的优化还是比较简单的,可能很多同学不知道队列的知识,需要参考数据结构里的知识。
参考代码:
#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小时内删除。