贪心推公式(acwing125,acwing 114)

acwing125 耍杂技的牛

思想:假设前一头牛与下一头牛交换位置,观察两个牛交换前后两头牛的风险值的变化。

代码:

#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;
}
发布了53 篇原创文章 · 获赞 14 · 访问量 1888

猜你喜欢

转载自blog.csdn.net/weixin_45630535/article/details/104848213
114