abcG题求条
  • 板块学术版
  • 楼主pxn1234
  • 当前回复3
  • 已保存回复3
  • 发布时间2025/7/21 08:51
  • 上次更新2025/7/21 13:58:51
查看原帖
abcG题求条
1632009
pxn1234楼主2025/7/21 08:51
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define pii pair<int,int>
const int inf = 1e9;
const int N = 2e5 + 10;

int n,m;
struct Opt {
    int a,b,c;//c 净消耗
    double k;//转化率
} opt[N];
int sb[N];

bool cmp(Opt x,Opt y) {
    return x.k>y.k;
}

int dp[400010];

int DP(int x) {
    int ans=0;
    dp[x]=x;
    for(int i=1; i<=m; i++) {
        for(int j=x; j>=0; j--) {
            if(j>=opt[i].a) {
                dp[j-opt[i].c]=max(dp[j-opt[i].c],dp[j]+opt[i].b);
            }
        }
    }
    for(int i=0; i<=x; i++) ans=max(ans,dp[i]);
    return ans;
}

signed main() {
    scanf("%lld%lld",&n,&m);
    for(int i=1; i<=m; i++) {
        int a,b,c;
        double k;
        scanf("%lld%lld",&a,&b);
        sb[a]=max(sb[a],b);
        if(b<sb[a]) {
            i--,m--;
            continue;
        }
        c=a-b;
        k=b*1.0/a;
        opt[i]= {a,b,c,k};
    }
    sort(opt+1,opt+m+1,cmp);
    if(n<=300000){
    	cout<<DP(n);
    	return 0;
	}
	n-=300000;
	int ans2=n-300000;
	int cycle=n/opt[1].c-1;
    ans2+=cycle*opt[1].b;
    n-=cycle*opt[1].c;
    cout<<ans2+DP(n)-n;
    return 0;
}


2025/7/21 08:51
加载中...