1033. To Fill or Not to Fill (25)

来源:互联网 发布:sql server个人版安装 编辑:程序博客网 时间:2024/06/08 11:25

1033. To Fill or Not to Fill (25)
考察贪心

#include <iostream>#include <vector>#include <algorithm>#include <cstdio>using namespace std;struct node{    double pi;    double di;};bool comp(const node &a,const node &b){    return a.di<b.di;}int main(){    double cmax,d,davg,n;    vector<node> v;    cin>>cmax>>d>>davg>>n;    while(n--)    {        node temp;        cin>>temp.pi>>temp.di;        v.push_back(temp);    }    sort(v.begin(),v.end(),comp);    double consum=0.0,curgas=0.0,curd=0.0;    bool iscompelete=true;    if(v[0].di!=0)//测试点2    {        printf("The maximum travel distance = %.2lf\n",0.0);        return 0;    }    for(auto it=v.begin();it!=v.end();)    {        auto p=it,next=it,less=it+1;        double dis=0.0,addgas=0.0;        while((*p).di-(*it).di<=cmax*davg&&p!=v.end())        {            if((*p).pi<(*it).pi)            {                next=p;break;            }            if(p!=it)                less=((*p).pi<(*less).pi)?p:less;            ++p;        }        if(p==v.end())        {            if(d-(*it).di>cmax*davg)            {                iscompelete=false;                curd+=cmax*davg;                break;            }            dis=d-(*it).di;            consum+=(dis/davg-curgas)*(*it).pi;            break;        }        if(next!=it)        {            dis=(*next).di-(*it).di;            addgas=dis/davg-curgas;            consum+=(*it).pi*addgas;            curd=(*next).di;            curgas=0.0;            it=next;        }        else        {            dis=(*less).di-(*it).di;            addgas=cmax-curgas;            consum+=(*it).pi*addgas;            curd=(*less).di;            curgas=cmax-dis/davg;            it=less;        }    }    if(iscompelete)        printf("%.2lf",consum);    else        printf("The maximum travel distance = %.2lf",curd);    return 0;}
0 0
原创粉丝点击