G.机器人
题意:
有n个机器人,每个机器人会读入一个x,并返回ax+b。
现在有一个数x和n个机器人,每个机器人有参数a和b。
请你排列机器人,使得最后的参数尽可能的大。
询问最后的最大值。
题解:
两种做法。
第一种:
化简这个不等式:\(a_1(a_2x+b_2)+b_1<a_2(a_1x+b_1)+b_2\)
按照这个不等式对数组排序即可。
时间复杂度\(O(nlogn)\)。
第二种:
观察到n的范围只有20,状压DP。
\(20^{20}\)会爆Long Long,所以要用__int128存。
// Problem: 机器人
// Contest: NowCoder
// URL: https://ac.nowcoder.com/acm/contest/9986/G
// Memory Limit: 1048576 MB
// Time Limit: 6000 ms
//
// Powered by CP Editor (https://cpeditor.org)
#include<bits/stdc++.h>
using namespace std;
const int maxn=1010;
pair<int,int> a[maxn];
long long ans=0;
long long x;
int n;
bool cmp (pair<int,int> x,pair<int,int> y) {
return 1ll*x.first*y.second+x.second<1ll*y.first*x.second+y.second;
}
void print(__int128 x){
if(x>9)print(x/10);
putchar(x%10+'0');
}
int main () {
scanf("%d%d",&n,&x);
for (int i=1;i<=n;i++) scanf("%d%d",&a[i].first,&a[i].second);
sort(a+1,a+n+1,cmp);
__int128 ans=x;
for (int i=1;i<=n;i++) ans=ans*a[i].first+a[i].second;
print(ans);
}