Online JudgeProblem SetAuthorsOnline ContestsUser
Web Board
Home Page
F.A.Qs
Statistical Charts
Problems
Submit Problem
Online Status
Prob.ID:
Register
Update your info
Authors ranklist
Current Contest
Past Contests
Scheduled Contests
Award Contest
User ID:
Password:
  Register

Re:回去查了下不同版本的g++的浮点处理不一样,不知道是不是这个原因

Posted by ixor at 2013-04-03 19:49:04 on Problem 1064
In Reply To:这题有bug吧,过去ac的程序现在也不行 Posted by:ixor at 2013-04-03 19:44:16
> 用了ac的代码试了下,也不行,蛋都碎了!!!
> 
> 我已经神经质地把所有int8换成int64了,下面代码如有bug,求狠拍!
> ---------------------------------------
> 
> 
> #include <stdio.h>
> #include <algorithm>
> 
> using namespace std;
> 
> void sum_up(long long *ary, long long len, long long *sum)
> {
>     sum[0] = ary[0];
>     for(long long i = 0; i < len; i ++)
>         sum[i + 1] = sum[i] + ary[i + 1];
> }
> 
> bool validate(long long *ary, long long *sum, long long ary_len, long long frag_cnt, long long len)
> {
>     if(frag_cnt <= 0)
>         return true;
> 
>     if(ary_len == 0 && frag_cnt != 0)
>         return false; 
> 
>     if(sum[ary_len - 1] < frag_cnt * len)
>         return false;
> 
>     long long consume = ary[ary_len - 1] / len;
> 
>     if(consume == 0)
>         return false;
> 
>     return validate(ary, sum, ary_len - 1, frag_cnt - consume, len);
> }
> 
> 
> long long bin(long long *ary, long long *sum, long long ary_len, long long frag_cnt, long long begin, long long end)
> {
>     if(end == begin)
>         return begin;
> 
> 	if(end - begin == 1)
> 	{
> 		if(validate(ary, sum, ary_len, frag_cnt, end))
> 			return end;
> 		return begin;
> 	}
> 
> 	long long middle = (begin + end) / 2;
> 
> 	if(validate(ary, sum, ary_len, frag_cnt, middle))
> 		return bin(ary, sum, ary_len, frag_cnt, middle, end);
> 	else
> 		return bin(ary, sum, ary_len, frag_cnt, begin, middle);
> }
> 
> void calc(long long *ary, long long *sum, long long ary_len, long long frag_cnt)
> {
> 
> 	if(!validate(ary, sum, ary_len, frag_cnt, 1))
> 	{
> 		printf("0.00\n");
> 		return;
> 	}
> 
> 	long long max = sum[ary_len - 1] / frag_cnt;
> 	max = max > ary[ary_len - 1] ? ary[ary_len - 1] : max;
> 
> 	long long result = bin(ary, sum, ary_len, frag_cnt, 1, max);
> 
> 	double f = result / 100.0f;
> 	printf("%.2lf\n", f);
> }
> 
> int main(void)
> {
> 	long long n, k;
> 	long long cables[10002];
> 	long long sum[10002];
> 
>     while(scanf("%lld %lld", &n, &k) != EOF)
>     {
>         double temp;
>         for(long long i = 0; i < n; i ++)
>         {
>             scanf("%lf", &temp);
>             cables[i] = (long long)((temp + 0.005) * 100);
>         }
>         sort(cables, cables + n);
> 
>         sum_up(cables, n, sum);
> 
>         calc(cables, sum, n, k);
>     }
>     return 0;
> }

Followed by:

Post your reply here:
User ID:
Password:
Title:

Content:

Home Page   Go Back  To top


All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator