http://acm.hdu.edu.cn/showproblem.php?pid=4883
这道题还是想的不够仔细
#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[n].start,can=a[n].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;
}
这个代码写错了 一开始的理解就是桌子不是通用的 (感觉像贪心工程时间一样)
后来才发现 前一桌人走了 后面的人可以再坐上来 于是我这个代码错的很正常了
#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还是希望自己能自己思考