1. 程式人生 > >P2338 [USACO14JAN]失敗的滑雪Bessie Slows Down

P2338 [USACO14JAN]失敗的滑雪Bessie Slows Down

P2338 [USACO14JAN]失敗的滑雪Bessie Slows Down

一道模擬的藍題

資料型別一定不要寫錯啊!!!

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;

int N;
char err;
double T[10005],pret,z1=1;
int cnt1;
double D[10005],pred,z2=1;
int cnt2;
int data;
double s;
double ans;
int cnt=1;

int main()
{
//    freopen("test.in","r",stdin);
    scanf("%d",&N);
    for(int i=1;i<=N;i++)
    {
        cin>>err;
        scanf("%d",&data);
        if(err=='T')    {T[++cnt1] = data;}
        else    {D[++cnt2] = data;}     
    }
    sort(T+1,T+cnt1+1);
    sort(D+1,D+cnt2+1);
    int l=1,r=1;
    for(int i=1;i<=N;i++)
    {
        if((r>cnt2||((D[r]-s)*cnt+ans>=T[l]))&&(l<=cnt1))
        {
            if((T[l]-ans)/cnt+s>1000)   {break;}
            s+=((T[l]-ans)/cnt);
            ans=T[l];
            cnt++;
            l++;
        }
        else
        {
            if(D[r]>1000)   {break;}
            ans+=(D[r]-s)*cnt;
            s=D[r];
            cnt++;
            r++;
        }
    }
//    ans=int((1000-s)*cnt+ans+0.499999);
    cout<<int((1000-s)*cnt+ans+0.499999)<<endl;

    return 0;
}

之前好像也一直是這個問題

//錯解
    for(int i=1;i<=N;i++)
    {
        if(z2>cnt2||s+(T[z1]-pret)*(1.0/(cnt+1))<D[z2])
        {
            cnt++;
            s+=(T[z1]-pret)*(1.0/cnt);//t
        //  pred=(T[z1]-pret)*(1/cnt);
            ans+=(T[z1]-pret);
            pret=ans;
            z1++;
        }

        if(z1>cnt1&&z2>cnt2)    {break;}

        if(z1>cnt1||s+(T[z1]-pret)*(1.0/(cnt+1))>D[z2]) 
        {
            cnt++;
            ans+=(D[z2]-s)*cnt;
            s+=(D[z2]-s);
            pret=ans;
            z2++;
        }

        if(z1>cnt1&&z2>cnt2)    {break;}
    }

    if(s<1000)
    ans+=(1000-s)*(cnt+1);