任意门
Problem Description
小蜗蜗有 n 个数字(实数),但他不知道这些数字具体是啥。
他只知道这 n 个数字的最大值、最小值和平均值,但也不一定是对的。
现在,小蜗蜗想知道,存不存在一种方案,使得这 n 个数字的最大值、最小值和平均值恰好等于给定值。
Input
第一行读入一个整数 test(1\leq test \leq 100000) 表示数据组数。
接下来 test 行,每行四个整数 n, max, min, ave(1 \leq n \leq 100000, -100 \leq max, min, ave \leq 100) 分别表示最大值、最小值和平均值。
注意,一开始的 n 个数字的取值范围是实数。
Output
输出共 test 行。
对于第 i 行,如果存在一组合法方案,输出 yes,否则输出 no。
Sample Input
2
3 1 1 1
2 3 1 1
Sample Output
yes
no
这道题好可惜哦,大体思路没有错,但是忘了当n=1和n=2的时候要特判,哭哭哭~
思路
在max>=min的条件下,看n*ave-min-max是否在n-2个数的和的范围内。
自己的不足之处就是如果用ave来乘n就会比另外一边来除以n来的简单,就不用考虑除以之后的精度问题,向上取整和向下取整的问题。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,_max,_min,avg;
scanf("%d%d%d%d",&n,&_max,&_min,&avg);
if(_max<_min||avg<_min||avg>_max){printf("no\n");continue;}
if(n==1)
{
if(_max==avg&&_min==avg)
printf("yes\n");
else printf("no\n");
continue;
}
if(n==2)
{
if(_min<=_max&&avg*2==_max+_min)
printf("yes\n");
else printf("no\n");
continue;
}
if(((n-1)*_min+_max<=avg*n)&&((n-1)*_max+_min>=avg*n))
printf("yes\n");
else printf("no\n");
} return 0;
}
但是后来发现其实不用特判也可以写出来的,那就是与我之前的思路一模一样,我就是想多了,做复杂了,如果相乘的话,会简单很多,做复杂了。
#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>
#include<math.h>
using namespace std;
int main()
{
int T;
scanf("%d",&T);
while(T--)
{
int n,_max,_min,avg;
scanf("%d%d%d%d",&n,&_max,&_min,&avg);
if(_max<_min)
{
puts("no");
continue;
}
int l=_max*(n-1)+_min;
int r=_min*(n-1)+_max;
if(avg*n<=l&&avg*n>=r)
{
puts("yes");
}
else puts("no");
}
return 0;
}