简单排序。题意较长。
#include<cstdio> #include<cstring> #include<cmath> #include<queue> #include<vector> #include<string> #include<stack> #include<map> #include<algorithm> using namespace std; struct X { int id; int v,t; int f; }s[100000+10],tmp[100000+10],Ans[100000+10]; int n,L,H; int tot; bool cmp(const X&a,const X&b) { if(a.t+a.v==b.t+b.v&&a.v==b.v) return a.id<b.id; if(a.t+a.v==b.t+b.v) return a.v>b.v; return a.t+a.v>b.t+b.v; } int main() { scanf("%d%d%d",&n,&L,&H); for(int i=1;i<=n;i++) scanf("%d%d%d",&s[i].id,&s[i].v,&s[i].t); for(int i=1;i<=n;i++) s[i].f=0; for(int i=1;i<=n;i++) if(s[i].t<L||s[i].v<L) s[i].f=1; tot=0; int ans=0; for(int i=1;i<=n;i++) { if(s[i].f==1) continue; if(s[i].t>=H&&s[i].v>=H) { tmp[tot++]=s[i]; s[i].f=1; } } sort(tmp,tmp+tot,cmp); for(int i=0;i<tot;i++) Ans[ans++]=tmp[i]; tot=0; for(int i=1;i<=n;i++) { if(s[i].f==1) continue; if(s[i].t<H&&s[i].v>=H) { tmp[tot++]=s[i]; s[i].f=1; } } sort(tmp,tmp+tot,cmp); for(int i=0;i<tot;i++) Ans[ans++]=tmp[i]; tot=0; for(int i=1;i<=n;i++) { if(s[i].f==1) continue; if(s[i].t<H&&s[i].v<H&&s[i].v>=s[i].t) { tmp[tot++]=s[i]; s[i].f=1; } } sort(tmp,tmp+tot,cmp); for(int i=0;i<tot;i++) Ans[ans++]=tmp[i]; tot=0; for(int i=1;i<=n;i++) { if(s[i].f==1) continue; tmp[tot++]=s[i]; s[i].f=1; } sort(tmp,tmp+tot,cmp); for(int i=0;i<tot;i++) Ans[ans++]=tmp[i]; tot=0; printf("%d\n",ans); for(int i=0;i<ans;i++) { printf("%08d %d %d\n",Ans[i].id,Ans[i].v,Ans[i].t); } return 0; }
时间: 2024-11-26 00:04:31