查了很久才觉得精度出问题,这些oj不放个报错的用例真难受,简单题让我怀疑我是不是学这个的料(可能我并不适合,我是纯兴趣,不带功利性)
精度输出cin 会自动省略后置零, 而printf多用于保留几位,但我记得好像有个是让printf略去零,我忘了
http://acm.hdu.edu.cn/showproblem.php?pid=2570
这题要换一个思路,不能用浓度去比较,用物质的量去比较,从而减少误差
我之前是这样写的
#include<bits/stdc++.h>
using namespace std;
int main() {
int c, n, v;
cin >> c;
while(c--) {
int nums[10000], ans = 0, vol = 0;
float w;
cin >> n >> v >> w;
float pi = 0;
for(int i = 0; i < n; i++) {
cin >> nums[i];
}
sort(nums, nums + n);
for(int i = 0; i < n; i++) {
pi += nums[i], vol += v;
if(w / 100 > pi / vol && fabs(w / 100 - pi / vol) > 1e-7 || fabs(w / 100 - pi / vol) <= 1e-7) {
ans++;
} else {
pi -= nums[i], vol -= v;
break;
}
}
if(ans == 0) {
printf("0 0.00\n");
} else {
printf("%d %.2f\n", vol, pi / vol);
}
}
return 0;
}
过不完
用物质的量比较可以过
#include<bits/stdc++.h>
using namespace std;
int main() {
int c, n, v, w;
cin >> c;
while(c--) {
int nums[10000];
cin >> n >> v >> w;
for(int i = 0; i < n; i++)
cin >> nums[i];
sort(nums, nums + n);
float con = 0.00;
int vol = 0;
for(int i = 0; i < n; i++) {
if(vol * con + nums[i] * v <= w * (v + vol)) {
con = (vol * con + nums[i] * v) / (v + vol);
vol += v;
} else {
break;
}
}
if(vol == 0) {
printf("0 0.00\n");
} else {
printf("%d %.2f\n", vol, con / 100);
}
}
return 0;
}