A. 强迫症
这道题是有难度的,难度在哪呢?
对,是的,没错,难度就在对于题目的理解。
阅读理解嘛,大家应该都知道汉译英再译汉以后的文章正常人是看不懂的,但如果大致看也可以勉强理解其意思。对于这道题我们可以采用这种方式来理解题目。
通读题目,什么emo不emo的不要管,我们需要知道的就是如果西瓜数和朋友数能满足所有朋友分到的西瓜数都是偶数,我们就输出YES,否则输出NO即可。
知道了这一点,我们就可以去思考什么样的两个数n, m是满足这个要求的了
首先,如果需要保证每个朋友分到的西瓜数都是偶数的话,若干个偶数之和一定是偶数,所以n必须要是偶数
其次,要保证m个朋友都要分到西瓜(西瓜数不为0),所以每个朋友能分到的西瓜最少是2个,即n最小为2 * m,进一步推出n >= 2 * m
只要同时满足以上两个条件,我们就输出YES,否则输出NO即可(注意大小写)
#include <stdio.h>
int main()
{
int n, m;
scanf("%d %d",&n,&m);
if(n % 2 == 0 && n >= m * 2) printf("YES");
else printf("NO");
return 0;
}
写到这里, 这道题看似就结束了, 但是,提交后会发现答案错误83%。
往下仔细看题, 会发现这道题把最重要的数据范围给放到了提示里(很离谱对吧)
提示中说, 数据保证m和n在32位有符号整型范围内。看起来很莫名其妙对吧,但只要我们稍微回忆一下, 就会发现, int的范围就是32位有符号整型, 而我们在数据处理过程中用到了2 * m, 细想一下, 如果m已经是int范围内的最大数字, 那它乘2的话就会超出int的范围, 从而导致错误。
这时候我们可以考虑换用范围更大的整型long long或者将判断语句n >= m * 2改为n / 2 >= m即可
AC代码如下:
#include <stdio.h>
int main()
{
long long n, m;
scanf("%lld %lld",&n,&m);
if(n % 2 == 0 && n >= m * 2) printf("YES");
else printf("NO");
return 0;
}
B.刷题时长
这道题其实题面还是挺好理解的, 常规思路的话, 就是看有多少不重复数字就可以了
一个while循环用来读入每组l和r, 一个数组用来记录出现过的数字, ans用来记录答案即可
AC代码如下:
#include <stdio.h>
int q[100010];
int main()
{
int t, l, r, ans = 0;
scanf("%d",&t);
while(t --)
{
scanf("%d%d",&l,&r);
for(int i = l; i <= r; i ++)
{
if(q[i] == 0) ans ++; //将时间点作为数组下标, 数字的0/1值用于记录该时间是否出现过
q[i] = 1; //记录当前时间
}
}
printf("%d", ans);
return 0;
}
C.合唱比赛
这道题的题面很易懂, 在我们已经拿到的n个评委给出的分数的基础上, 我们再打出一个分数
然后计算这n + 1个分数在去掉一个最大值和一个最小值后的平均值, 计算出一个最终得分区间
区间左端点:当我们给出的分是最低分的时候, 此时最高分为题给最高分, 平均分最小
区间右端点:当我们给出的分是最高分的时候, 此时最低分为题给最低分, 平均分最大
AC代码如下:
#include <stdio.h>
int main()
{
int n;
double z, x = 0, y = 101, ans = 0;
scanf("%d",&n);
for(int i = 1; i <= n; i ++)
{
scanf("%lf",&z);
ans += z;
if(z > x) x = z;
if(z < y) y = z;
}
printf("%lf %lf", (ans - x) / (n - 1), (ans - y) / (n - 1));
return 0;
}