思想:假设前一头牛与下一头牛交换位置,观察两个牛交换前后两头牛的风险值的变化。
代码:
#include <climits>
#include <algorithm>
#include <iostream>
using namespace std;
typedef long long LL;
typedef pair<int, int> PII;
const int N = 50010;
PII cow[N];
int main()
{
int n; cin >> n;
for(int i = 0; i < n; i ++)
{
int w, s;
scanf("%d %d", &w, &s);
cow[i] = {w + s, w};
}
sort(cow, cow + n);
int res = INT_MIN, sum = 0;
for(int i = 0; i < n ; i ++)
{
res = max(sum + cow[i].second - cow[i].first , res);
//cout << cow[i].second - cow[i].first << endl;
sum += cow[i].second;
}
cout << res << endl;
return 0;
}
acwing114国王游戏
跟上边的思想一样, 用到了高精度, 这里的高精度一开始写没写出来,看了一眼大佬写的, 今晚得练一下高精度了~ 还是菜 a。
#include <climits>
#include <vector>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 1100;
typedef pair<double, int> PII;
struct E
{
int l, r;
bool operator < (const E w) const
{
return l * r < w.l * w.r;
}
}alls[N];
vector<int> mul(vector<int> a, int b)
{
vector<int> c;
int t = 0;
for(int i = 0; i < a.size(); i ++)
{
t += b * a[i];
c.push_back(t % 10);
t /= 10;
}
while(t) c.push_back(t % 10), t /= 10;
return c;
}
vector<int> div(vector<int> a, int b)
{
vector<int> c;
int t = 0;
bool flag = false;
for(int i = a.size() - 1; i >= 0; i --)
{
t = t * 10 + a[i];
int x = t / b;
if(x || flag)
{
flag = true;
c.push_back(x);
t %= b;
}
}
return vector<int> (c.rbegin(), c.rend());
}
vector<int> max_vec(vector<int> a, vector<int> b)
{
if(a.size() > b.size()) return a;
if(a.size() < b.size()) return b;
if(vector<int>(a.rbegin(), a.rend()) > vector<int>(b.rbegin(), b.rend()))
return a;
return b;
}
int main()
{
int n; cin >> n;
for(int i = 0; i <= n ; i ++)
{
int a, b; cin >> a >> b;
alls[i] = {a, b};
}
sort(alls + 1, alls + n + 1);
vector<int> res(1, 0);
vector<int> sum(1, 1);
for(int i = 0; i <= n ; i ++)
{
if(i) res = max_vec(res, div(sum, alls[i].r));
sum = mul(sum, alls[i].l);
}
//cout << res.size() << endl;
for(int i = res.size() - 1; i >= 0; i --) cout << res[i];
cout << "\n";
return 0;
}