2 条题解
-
1
一种分治的写法
#include<cstdio> #include<cstring> #include<string> #include<cmath> #include<algorithm> #include<vector> #include<queue> #define rep(x,a,b) for (int x=int(a);x<=(int)(b);x++) #define drp(x,a,b) for (int x=int(a);x>=(int)(b);x--) #define cross(x,a) for (int x=hd[a];~x;x=nx[x]) #define ll long long using namespace std; ll x,y,n,ans,m,l,r; double xx,yy; /*int round_(double number) { return (number > 0.0) ? floor(number + 0.5) : ceil(number - 0.5); }手写round*/ int main() { freopen("film.in","r",stdin); freopen("film.out","w",stdout); while (scanf("%lf%lf%lld",&xx,&yy,&n)!=EOF) { x=round(xx*10000),y=round(yy*10000);//?四舍五入 if (x!=100000)//判断是否为十分 { x+=500;//消除精度问题,最坏的情况是x数值比较大 x*=n;//总投票数 //?总投票数必须要 if (x%10000==0) x-=10000; else x-=x%10000; } else x*=n;//十分没有误差,直接求出总票数 //处理精度 l=0,r=100000000000;//二分边界定大点,放心不会超 ans=0;//投票数 do { m=(l+r)>>1;//非负整数等同于处于2 if (x+m*10000<((y+500)*(n+m))) ans=m,r=m;//每次加一分平均分下落肯定最快 else l=m; }while (l+1<r);//好像我的二分不是很规范啊。。。 if (xx<=yy) ans=0;//判断初始情况,这种情况不需要再投票了 printf("%lld\n",ans);//输出结果 } return 0; }
信息
- ID
- 1366
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 8
- 标签
- 递交数
- 49
- 已通过
- 6
- 上传者