您的位置:首页 > 其它

HDU4883

2015-12-29 23:02 190 查看
http://acm.hdu.edu.cn/showproblem.php?pid=4883

这道题还是想的不够仔细

[code]#include<cstdio>
#include<algorithm>
using namespace std;
const int inf=0x3f3f3f3f;
typedef long long ll;
struct note
{
    ll start,aim,num;
}a[10001];
ll cmp(note aa,note bb)
{
    if(aa.aim!=bb.aim)
        return (aa.aim<bb.aim);
    else
        return aa.start>bb.start;
}
int main()
{
    ll T;
    //freopen("test1.txt","r",stdin);
    scanf("%lld",&T);
    while(T--)
    {
        ll n,nums=0;
        scanf("%lld",&n);
        ll x,y;
        for(ll k=1;k<=n;k++)
        {
            scanf("%d",&a[k].num);
            ///prllf("%d\n",a[k].num);
            scanf("%2lld:%2lld",&x,&y);
            a[k].start=x*60+y;
            scanf("%2lld:%2lld",&x,&y);
            ///prllf("%d %d\n",x,y);
            a[k].aim=x*60+y;
            //prllf("%d %d\n",a[k].start,a[k].aim);
        }
        sort(a+1,a+n+1,cmp);
        //prllf("%d  %d\n",a[1].aim,a[2].aim);
        if(n==1){
            printf("%lld\n",a[1].num);
            continue;
        }
        ll ans=0,time=a
.start,can=a
.num;
        for(ll i=n-1;i>=1;i--)
        {
            //prllf("%d %d %d\n",time,i,a[i].aim);
            if(a[i].aim<=time){
                can=max(can,a[i].num);
            }
            else{
                ans+=a[i].num;
            }
            time=a[i].start;
        }
        ///prllf("%d\n",can);
        ans+=can;
        printf("%lld\n",ans);
    }
    return 0;
}


这个代码写错了 一开始的理解就是桌子不是通用的 (感觉像贪心工程时间一样)

后来才发现 前一桌人走了 后面的人可以再坐上来 于是我这个代码错的很正常了

[code]#include<cstdio>
#include<algorithm>
#include<iostream>
#include<cstring>
using namespace std;
const int inf=0x3f3f3f3f;
const int MAX_=2001;
int a[MAX_];
bool used[MAX_];

char t;
int k;
inline void scanf_(int &data)
{
    char ch = getchar();
    while (ch < '0' || ch > '9')
        ch = getchar();
    data = 0;
    do
    {
        data = data*10 + ch-'0';
        ch = getchar();
    }
    while (ch >= '0' && ch <= '9');
}
/***
//inline void scanf_(int & data){
//    data=0;
//    while(true)
//    {
//        t=getchar();
//        if(t>='0'&&t<='9'){
//            goto loop;
//        }
//    }
//    while(true)
//    {
//        t=getchar();
//        if(t>='0'&&t<='9'){
//            loop:
//            data=(data*10+(t-'0'));
//        }
//        else break;
//    }
//}
*/
int main()
{
    int T,x,y,num,ans,n,t1,t2;
    cin>>T;
    while(T--)
    {
        scanf("%d",&n);
        memset(a,0,sizeof(a));
        memset(used,false,sizeof(used));
        ans=0;
        for(int i=1; i<=n; i++)
        {
            scanf_(num);
            scanf_(x);
            scanf_(y);
            ///事实证明我自己YY的输入外挂和
            ///scanf
            ///一个效率
            ///scanf("%d%d:%d",&num,&x,&y);
            /// cout<<x<<" "<<y<<endl;
            t1=x*60+y;
            ///scanf("%d:%d",&x,&y);
            scanf_(x);
            scanf_(y);
            t2=x*60+y;
            ///if(!used[t1])a[t1]+=num;
            ///if(!used[t2])a[t2]+=num;
            ///我的理解又错了  我以为首尾标记一下
            ///如果被标记了  就说明前一桌子人刚走 就不用再加上  
            ///因为题目说了这是不用加的
            ///我又看了题解
            ///才知道  这不过就是等价成你晚一分钟在吃就行了
            for(int j=t1+1; j<=t2; j++)
            {
                a[j]+=num;
                ///ans=max(ans,a[j]);
                ///还有这  很费时间  每次更新 都  MAX一遍
            }
            ///used[t2]=true;
        }
        for(int i=0; i<=2000; i++)
            ans=max(ans,a[i]);
        printf("%d\n",ans);
    }
    return 0;
}


还是觉得自己不适合BC这些题目 太需要思考了 而我经常看题解 以至于自己进步不大

以后多做BC还是希望自己能自己思考
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: