http://codeforces.com/contest/352/problem/C
题意:给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小
对每一个浮点数都取其下限,得到的差值就是所有浮点数小数部分的和;然后则需要从2*n个数里面选出n个数取其上限,即下限加1,而如果这个数是个整数,那么不需要加1;因此统计加1个数的上限和下限即可;然后选择min abs(小数部分的和-加1的个数);
1 #include <cstdio> 2 #include <cstring> 3 #include <cmath> 4 #include <algorithm> 5 using namespace std; 6 const double eps=1e-20; 7 int n; 8 double a[10010]; 9 10 double min1(double a,double b) 11 { 12 if(a>b) return b; 13 else return a; 14 } 15 16 int main() 17 { 18 scanf("%d",&n); 19 int t1=0,t2=0; 20 double sum=0; 21 int s,t; 22 for(int i=0; i<2*n; i++) 23 { 24 scanf("%lf",&a[i]); 25 double m=a[i]-(int)a[i]; 26 sum+=m; 27 if(m>eps) t1++; 28 else t2++; 29 } 30 double ans=1e11; 31 if(t1<=t2) 32 { 33 s=0; t=t1; 34 } 35 else 36 { 37 s=n-t2; t=n; 38 } 39 for(int i=s; i<=t; i++) 40 { 41 ans=min1(ans,fabs(sum-i)); 42 } 43 printf("%.3lf ",ans); 44 return 0; 45 }