【积累】排序题积累

洛谷P1417

挺好的一道排序题了。

 主要是不会怎么去排序。然后就是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

/////////////////////////////

Fight Against Monsters

#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);
}

 /////////////////////////////////////////////

原文地址:https://www.cnblogs.com/kkkek/p/11479397.html