Nowcoder9986G.机器人(__int128、思维、状压DP、贪心)

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);
}
上一篇:关联容器操作


下一篇:简洁的取模还原分数方法