加载中…
个人资料
  • 博客等级:
  • 博客积分:
  • 博客访问:
  • 关注人气:
  • 获赠金笔:0支
  • 赠出金笔:0支
  • 荣誉徽章:
正文 字体大小:

UVA 11935 K Through the Desert

(2011-03-01 16:33:40)
标签:

uva

11935

k

through

the

desert

it

分类: 杂题
题目描述:
一辆车要走一段路程,路上有 路段耗油速度,漏油,加油,修复漏油,到达终点5个事件。
问你油箱的容量最少是多少能够保证走完全程。
解题报告:
二分枚举容量mid,然后模拟题目输入的事件,看看能否走完即可。
代码如下:

#include<iostream>
#include<cstdio>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
struct p
{
    p(int a, int b, double c){d = a; type = b; v = c;}
    p(){}
    int d;
    int type;
    double v;
}x[100];
bool cmp(p a, p b)
{
    if (a.d == b.d) return a.type < b.type;
    return a.d < b.d;
}
string str;
int cnt;
bool judge(double mid)
{
    int leak = 0;
    double now = mid, sp = 0;
    int s = 0;
    for(int i = 0; i < cnt; i++)
    {
        if (x[i].type == 1)
        {
            now -= ((x[i].d - s) * (sp + leak));
            s = x[i].d;
            sp = x[i].v;
            if (now < 0) return false;
        }
        else if (x[i].type == 2)
        {
            now -= ((x[i].d - s) * (sp + leak));
            s = x[i].d;
            leak++;
            if (now < 0) return false;
        }
        else if (x[i].type == 3)
        {
            now -= ((x[i].d - s) * (sp + leak));
            s = x[i].d;
            if (now < 0) return false;
            now = mid;
        }
        else if (x[i].type == 4)
        {
            now -= ((x[i].d - s) * (sp + leak));
            s = x[i].d;
            leak = 0;
            if (now < 0) return false;
        }
        else if (x[i].type == 5)
        {
            now -= ((x[i].d - s) * (sp + leak));
            s = x[i].d;
            if (now < 0) return false;
        }
    }
    return true;
}
int main()
{
    int d;
    double v;
    while(cin >> d >> str >> str >> v)
    {
        if (v == 0) break;
        cnt = 0;
        v /= 100.0;
        x[cnt++] = p(d, 1, v);
        while(cin >> d)
        {
            cin >> str;
            int type;
            if (str == "Fuel")
            {
                cin >> str >> v;
                v = v / 100.0;
                type = 1;
            }
            else if (str == "Leak") type = 2;
            else if (str == "Gas")
            {
                cin >> str;
                type = 3;
            }
            else if (str == "Mechanic")
                type = 4;
            else type = 5;
            x[cnt++] = p(d, type, v);
            if (type == 5) break;
        }
        sort(x, x + cnt, cmp);
        double l = 0, r = 10000000;
        while(r - l >= 0.0001)
        {
            double mid = (l + r) * 0.5;
            int tmp = judge(mid);
            //cout << mid << ' ' << tmp << endl;
            if (tmp == 1) r = mid;
            else l = mid;
        }
        printf("%.3f\n", l);
    }
    return 0;
}

0

阅读 收藏 喜欢 打印举报/Report
  

新浪BLOG意见反馈留言板 欢迎批评指正

新浪简介 | About Sina | 广告服务 | 联系我们 | 招聘信息 | 网站律师 | SINA English | 产品答疑

新浪公司 版权所有