2013 南京站现场赛 --hdu4803Poor Warehouse Keeper

和队友模拟打的比赛,当时比赛这是四号题,队友们过了两道题,然后一直卡在这题上面,我检查了所有的算法,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;
}

你可能感兴趣的:(2013 南京站现场赛 --hdu4803Poor Warehouse Keeper)