给予N*2个数字,改变其中的N个向上进位,N个向下进位,使最后得到得数与原来数的差的绝对值最小
考虑小数点后面的数字,如果这些数都非零,则就是 abs(原数小数部分相加-1*n), 多一个0 则 min( abs(原数小数部分相加-1*n) ,abs(原数小数部分相加-1*(n-1)) )以此类推
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<stdio.h> int abs(int a){ if(a<0)return -a; else return a; } int Min(int a,int b){ if(a<b)return a; else return b; } int main(){ int n,i; while(scanf("%d",&n)!=EOF){ int n2=n*2; int ret=9999999,temp,all=0,k=0; for(i=1;i<=n2;i++){ scanf("%*d.%d",&temp); all+=temp; if(temp==0)k++; } for(i=0;i<=k;i++){ ret=Min(ret,abs(all-(1000*n-1000*i))); } printf("%d.%03d ",ret/1000,ret%1000); } return 0; }