【洛谷题解】AT_abc415_d 题解
秀丽的贪心呐。
考虑按照 \(A_i - B_i\) 的差值大小进行贪心。尽可能使用差值较小的。
差值相等?那优先用 \(A\) 小的。
所以首先存进结构体排个序,然后推个不等式算一通就是。
时间复杂度 \(O(m \log m)\)。
具体的细节看代码吧,代码超级无敌短。
#include<bits/stdc++.h>
#define LL long long
using namespace std;
const int M = 2e5+5;
struct node{LL x,y,d;}a[M];
LL n,m,ans;
bool cmp(node d1,node d2){return (d1.d<d2.d||(d1.d==d2.d&&d1.x<d2.x));}
//排序的比较函数
int main(){
cin>>n>>m;
for(int i=1;i<=m;i++){cin>>a[i].x>>a[i].y;a[i].d=a[i].x-a[i].y;}
//输入时顺便计算差值方便排序
sort(a+1,a+m+1,cmp);
//按差值从小到大排序,差值相等就按 A 排序
for(int i=1;i<=m;i++){
if(a[i].x>n)continue;
//如果这个方案用不了就跳过
LL tmp=(n-a[i].x+a[i].d)/a[i].d;
//推不等式计算出这个方案可以用多少次
ans+=tmp,n-=tmp*a[i].d;
//答案加上,n 的值要缩小
}
cout<<ans<<"\n";//最后输出即可
return 0;
}

浙公网安备 33010602011771号