第八届ACM趣味程序设计竞赛第一场(热身赛)题解

本文解析了五道经典编程题目,包括中庸之道、校门外的树、The King and Kingboss、铁路等,通过示例代码详细阐述了解题思路。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

B - 中庸之道(一)

       本题的题意十分清晰,很容易就可以想明白这就是一个简单的分类讨论。如题中所言,分两种情况,即3数不相等的情况和有2个数相等的情况。本题的坑点在于对于每组输入都需要输出一行答案,即\n,很多人因此PE。标准代码如下

#include<stdio.h>
#include<algorithm>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int a[4]={0};
        for(int i=0;i<3;i++) scanf("%d",&a[i]);
        std::sort(a,a+3);
        int flag = 0;
        if(a[0]==a[1] || a[1]==a[2]) flag = a[2];
        else flag = a[1];
        printf("%d\n",flag);
    }
    return 0;
}
C-校门外的树

     本题是一个模拟题,可以使用一个数组全部赋值为1表示现有的树,然后对于每一次操作,枚举区间内的所有树,将其赋值为0,最后统计数组中1的数量即可。

#include<stdio.h>
#include<string.h>
int main()
{
    int l,m;
    scanf("%d %d",&l,&m);
    char a[10002]={'0'};
    memset(a,'0',10002);
    memset(a,'1',l+1);
    while(m--)
    {
        int x,y;
        scanf("%d %d",&x,&y);
        memset(a+x,'0',y-x+1);
    }
    int count=0;
    for(int i=0;i<=l;i++)
        if(a[i]=='1')
            count++;
    printf("%d\n",count);
    return 0;
}
D-The King and King boss

    本题可以分为两种情况讨论,将n个整数做如下处理,令b[i] = a[1] + a[2] + a[3] + .. + a[i],这样的b[i] 有 n 个根据抽屉原理如果n个都不相同,则至少有一个是 n的倍数,否则存在b[j] % n == b[i] % n (i < j)则 b[j] - b[i] = a[i + 1] + a[i  + 2] + … + a[j]是n的倍数。因此,本题无论输入什么数,结果都为Yes.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main ()
{
 printf("Yes");
 return 0;
}
E-铁路
     此处需要分类讨论,我们容易想到两种为0的情况,一种是当k=0时,答案一定为0,另一种是当k=1且n>2时,结果一定为0。然后再分类讨论其他状况,如果k>=n-1,即可修建的铁路数已经超过了城市数量,则答案是在没两个城市之间就修建一条铁路,即(n-1)*n/2,另一种情况是当k<n-1时,无论怎样修建,都是可行的,因此结果是k*n/2,因此标程如下
#include<stdio.h>
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,k;
        scanf("%d%d",&n,&k);
        if(k == 0 || (k == 1 && n>2)) printf("0\n");
        else if(k<n-1)
            printf("%d\n",k*n/2);
        else
            printf("%d\n",n*(n-1)/2);
    }
    return 0;
}
另外,本场比赛主要是为了让大家熟悉oj的环境,所以所放的题都是老题,有很多人都做过,因此大家不必在意本场比赛的排名,从下周第一场正式赛开始,我们保证是原创题,届时一定不会像本场比赛一样,欢迎大家继续参加!


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值