CSP2019 , PJt2
**做法:暴力加剪枝**
- 按照时间快排一遍,保证时间单调,以便后面剪枝
- 循环扫一遍,然后分类讨论:
1.当前是地铁,答案直接加上地铁的钱。
2.当前是公交,可以从后往前扫,找到编号最小(时间最早)的地铁优惠票,然后剪枝是如果当前时间已经过了优惠的时间,就直接break。如果找到符合条件的,标记一下,否则没有符合条件的,把答案加上公交的钱
$Code:$
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; inline int read(){ register int x=0,v=1,ch=getchar(); while(!isdigit(ch)){if(ch=='-')v=-1;ch=getchar();} while(isdigit(ch)){x=(x<<3)+(x<<1)+(ch^'0');ch=getchar();} return x*v; } const int MAX=100005,N=105; struct GZ{int opt,p,t;}s[MAX]; inline bool cmp(GZ x,GZ y){return x.t<y.t;} int n,Ans,ce,vis[MAX]; int main(){ n=read(); for(register int i=1;i<=n;++i){ s[i].opt=read(),s[i].p=read(),s[i].t=read(); } sort(s+1,s+1+n,cmp); for(register int i=1;i<=n;++i){ if(s[i].opt==0){//subway Ans+=s[i].p; }else{//bus ce=-1; for(register int j=i;j;--j){ if(s[j].t<s[i].t-45){ break; } if(s[i].p<=s[j].p&&!vis[j]&&s[j].opt==0){ ce=j; } } if(ce==-1){ Ans+=s[i].p; }else vis[ce]=1; } } printf("%d\n",Ans); return 0; }