挺好的一道排序题了。
主要是不会怎么去排序。然后就是01背包。
洛谷的题解说得很好。有详细的cmp推导。
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int mod=1e9+7; const int maxn=1e5+50; struct P{ ll a,b,c; bool operator <(const P&p)const{return p.b*c<b*p.c;} }p[maxn]; int main() { ll n,T,i,j,k,t,w,ans=0; ll f[maxn]={0}; scanf("%lld%lld",&T,&n); for(i=1;i<=n;i++)scanf("%d",&p[i].a); for(i=1;i<=n;i++)scanf("%d",&p[i].b); for(i=1;i<=n;i++)scanf("%d",&p[i].c); sort(p+1,p+1+n); for(i=1;i<=n;i++) { for(j=T;j>=p[i].c;j--) { f[j]=max(f[j],f[j-p[i].c]+p[i].a-p[i].b*j); ans=max(ans,f[j]); } } printf("%lld ",ans); }
2019-09-09 23:11:21
/////////////////////////////
#include<bits/stdc++.h> using namespace std; typedef long long ll; const int maxn=5e5+50; const int inf=0x3f3f3f3f; ll atk,tim; struct P{ ll h,a; bool operator <(const P&p)const{return a*p.h>p.a*h;} }; int main() { ll a[550]={0}; for(int i=1;i<=500;i++) { a[i]=i*(i+1)/2; } int T,u; scanf("%d",&T); P p[maxn]; for(u=1;u<=T;u++) { ll n,i,ans=0,t,j,num=0; atk=0;tim=0; scanf("%lld",&n); for(i=1;i<=n;i++) { scanf("%lld%lld",&p[i].h,&p[i].a); atk+=p[i].a; t=lower_bound(a,a+500,p[i].h)-a; p[i].h=t; tim+=t; } sort(p+1,p+1+n); for(i=1;i<=n;i++) { ans+=atk*p[i].h; atk-=p[i].a; } printf("Case #%d: ",u); printf("%lld ",ans); }
//////////////////////////////////
特别水的排序题 然而我想得特别复杂,结果它其实特别水。洛谷P2945
#include<bits/stdc++.h> #define debug printf("!") using namespace std; typedef long long ll; const int maxn=1e5+50; int n,x,y; inline int get(int a,int b) { if(a>b)return (a-b)*y; return (b-a)*x; } int main() { int i,j,k,m[maxn],b[maxn],ans=0; scanf("%d%d%d",&n,&x,&y); for(i=0;i<n;i++) scanf("%d%d",&m[i],&b[i]); sort(b,b+n); sort(m,m+n); for(i=0;i<n;i++)ans+=get(m[i],b[i]); printf("%d ",ans); }
/////////////////////////////////////////////