和队友模拟打的比赛,当时比赛这是四号题,队友们过了两道题,然后一直卡在这题上面,我检查了所有的算法,100%没错了,但是精度把握不准!然后我一顿改!!!!!!!!!!!
真是要命,赛后加了一个提高精度的东西————(eps),然后就顺利的过了。Orz
这个东西还是真的厉害,以后碰到精度问题一定要用这个!!!!!!
const double eps=1e-6; double类型的eps最多保存到10的-6次方,(-7.-8.-9…..往后加相当于没用)
这题其实我觉得在cf上应该就是C题的样子,然后这个精度真的好尼玛恶心,巨jb 恶心,神特么恶心!!!
(吐槽完了),记录一下思路吧:
题意:就是说在一个屏幕上面,有两种操作
1.按x按钮(上面的按钮) 让货物数量+1,单价不变,总价会随之变化
2.按y(下面的),货物数量不变,总价+1,(即单价会发生变化)
问:从(1.1)变成(x.y)需要多少步(最少)
明显的贪心,十分钟就想好了,先按y 迅速变成 (1,y/x) ,然后再慢慢逐个增加y(思路见代码吧,比较水就懒得说了)
#include<iostream>
#include<stdio.h>
#include<string.h>
#include<math.h>
#include<algorithm>
#include<stdlib.h>
#include<queue>
#include<stack>
#include<map>
#include<vector>
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const double eps=1e-6;
double x, y;
int main() {
// freopen("1.txt","r",stdin);
while (scanf("%lf %lf", &x, &y) != EOF) { //x,y弄成double
if (y < x-1+eps) { //只有这一种情况无解
printf("-1\n");
continue;
}
if (x == 1) { //这种情况特判掉吧,不愿意想复杂
printf("%d\n", (int)y - 1);
continue;
}
int n = (int) (y / x);
int sum = 0;
sum += n ;
double x0 = 2.0, y0 = 2.0 * n;
while (x0 < x) { //这里如果直接用p=y0/x0,肯定会产生精度问题,所以先乘再除
while ( (y0*x)/x0 < y - eps ) { //如果说 这个y0 可以增加,那么让他加(eps增加精度)
y0++;
sum++;
}
if( (y0*x)/x0 > y + 1 -eps) { //如果最后>y 了,减一下就好(相当于上一步没做)
y0--;
sum--;
}
x0++;
if (x0 <= x)
y0= y0*x0/(x0-1)+eps;
sum++;
}
sum+=(int) ( y- (int)y0); //加上最后需要加的
printf("%d\n",sum);
}
return 0;
}