CodeForces

贪心

做的时候贪歪了,没做出来(菜)

思路:先按照每道题的ti从小到大排一下序,然后按照排好的序依次选取每一道题,每做完一道题的时候求一下当前的时间和下一道题的ti的差再减1(代表下一个必须做的题到来之前还有多少时间去做非必要的题),每做一道题更新结果即可。注意数据类型要开long long。

#include<bits/stdc++.h>
#include <cstdio>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<sstream>
#include<algorithm>
#include<cstdio>
#include<stdlib.h>
#include<string>
using namespace std;
typedef long long ll;
const int MAXN=1e6+10;
const int mod=998244353;
struct pp
{
    int f;
    int tt;
    bool operator <(pp &k)
    {
        return tt<k.tt;
    }
}aa[MAXN];
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        int n,T,a,b;
        ll diff=0,easy=0;
        scanf("%d%d%d%d",&n,&T,&a,&b);
        for(int i=1;i<=n;i++)
        {
            scanf("%d",&aa[i].f);
            if(aa[i].f==1)diff++;
            else easy++;
        }
        for(int i=1;i<=n;i++)
            scanf("%d",&aa[i].tt);
        sort(aa+1,aa+n+1);
        aa[n+1].tt=T+1;
        ll sum=0,ans=0,ans1=0,ff=0;
        for(int i=0;i<=n;i++)
        {
            if(i!=0)
            {
                if(aa[i].f)sum+=b,diff--;
                else sum+=a,easy--;
            }
            if((i==0||i==n||aa[i].tt!=aa[i+1].tt)&&sum<=T&&sum<aa[i+1].tt)
            {
                ll res=aa[i+1].tt-sum-1;
                ll mi=min(easy,res/a);
                res-=mi*a;
                ll ma=min(diff,res/b);
                ans=max(ans,i+mi+ma);
            }
            if(sum>T)break;
        }
        printf("%lld
",ans);
    }
}
View Code
原文地址:https://www.cnblogs.com/kayiko/p/12142074.html