codeforces 1186d D. Vus the Cossack and Numbers
题意:和为0的n个double数。上下取整后和还为0的构造一个。
首先都下取整,结果肯定<=0。和加起来再取绝对值num。则有num个数要上取整。那么小数部分为0的不变,不为0的挑num个上取整,其他的下取整。另外floor,ceil,round有可能丢失精度,不过这题没事。
(
PS:用强制转换是直接丢去小数,(int)1.1=1 ,(int)-1.1=-1。floor(1.1)=1.0 ,floor(-1.1)=-2.0。本题的num需从double转为int,最好全算完再转。要视num的正负决定+EPS还是-EPS。
//#pragma comment(linker, "/STACK:1024000000,1024000000") #include <iostream> #include <cstdio> #include <cmath> #include <algorithm> #include <vector> #include <iomanip> #include <cstring> #include <map> #include <queue> #include <set> #include <cassert> #include <stack> #include <bitset> #include <unordered_set> #define mkp make_pair #define err cout<<"err"<<endl #define gmin(x,y) x=min(x,y) #define gmax(x,y) x=max(x,y) #define lss ll,mid,rt*2 #define rss mid+1,rr,rt*2+1 using namespace std; const double EPS=1e-10; typedef long long lon; typedef pair<lon,lon> pii; typedef unsigned long long ull; const lon SZ=1000010,SSZ=21,APB=26,one=93,INF=0x3fffffffffffffff,mod=1000000007; const int intINF=0x3f3f3f3f; double PI=acos(-1); lon n; int tim; double arr[SZ]; double ans[SZ]; void init() { cin>>n; memset(ans,0x3f,sizeof(ans)); lon num=0; //num+=-1.7; //cout<<num<<endl; for(int i=1;i<=n;++i) { cin>>arr[i]; double tmp=num+floor(arr[i]); num=tmp>EPS?tmp+EPS:tmp-EPS; //lon a=5; //a+=-3.1; //cout<<"a: "<<a<<endl; //cout<<"i: "<<i<<" "<<num<<" "<<tmp-EPS<<endl; } num*=-1; //cout<<num<<endl; for(int i=1,j=0;i<=n;++i) { if(fabs(arr[i]-round(arr[i]))<EPS)ans[i]=round(arr[i]); else if(arr[i]>EPS) { if(num==0||j>=abs(num))ans[i]=floor(arr[i]); else if(num>0) { ans[i]=ceil(arr[i]); ++j; } else ans[i]=floor(arr[i]),++j; } else { if(num==0||j>=abs(num))ans[i]=floor(arr[i]); else if(num>0)ans[i]=ceil(arr[i]),++j; else ans[i]=floor(arr[i]),++j; } } for(int i=1;i<=n;++i) { if(fabs(ans[i])<EPS)ans[i]=EPS; cout<<fixed<<setprecision(0)<<ans[i]<<endl; } } void work() { } int main() { std::ios::sync_with_stdio(0); //freopen("d:\\1.txt","r",stdin); lon casenum; //cin>>casenum; //for(tim=1;tim<=casenum;++tim) //for(tim=1;cin>>n>>m;++tim) { //cout<<"Case "<<tim<<": "; //if(tim>=14)for(;;)cout<<"a"; init(); work(); } return 0; }
)