码迷,mamicode.com
首页 > 其他好文 > 详细

srm 535

时间:2015-06-11 16:57:51      阅读:113      评论:0      收藏:0      [点我收藏+]

标签:

250



Description

给a,b的gcd为G,lcm为L,求min(a+b)

Solution

水题,把a,b都先除以G,然后枚举即可

Code

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
class FoxAndGCDLCM {
    public:
        long long get(long long G, long long L) {
            if (L % G != 0) return -1;
            LL t = L / G;
            LL ans = 1000000000000000ll;
            for (LL i = 1; i * i <= t; ++i) {
                if (t % i == 0 && __gcd(i, t / i) == 1) ans = min(ans, G * (t / i + i));
            }
            return ans;
        }
};

500



Description:

给n个人,给定每个人一小时能做多少工作a[i],以及每单位工作需要支付他p[i]元,所有人工作时间相同,每秒需支付额外的1元。问选出K个人完成任务花费最小代价多少。

Solution

不妨考虑使得单位工作代价最小,和所求是等价的。显然可以二分答案。
易知mid×(a[x]+a[y]+....+a[z])(a[x]?p[x]+a[y]?p[y]+...+a[z]?p[z])+3600K时,答案可以更小。最后答案乘totwork即可

Code:

#include <bits/stdc++.h>
using namespace std;
#define pb push_back
#define mp make_pair
#define F first
#define S second
typedef long long LL;
typedef pair<int, int> pii;
const int N = 55;
double w[N];
class FoxAndBusiness {
    public:
        double minimumCost(int K, int totalWork, vector <int> a, vector <int> p) {
            int n = a.size();
            double l = 0, r = 1e18, mid;
            for (int i = 1; i <= 500; ++i) {
                mid = (l + r) * 0.5;
                for (int j = 0; j < n; ++j)
                    w[j] = mid * a[j] - (double)a[j] * p[j];
                sort(&w[0], &w[n]);
                reverse(&w[0], &w[n]);
                double t = 0;
                for (int j = 0; j < K; ++j) t += w[j];
                if (t >= 3600.0 * K)    r = mid;
                else l = mid;
            }
            return mid * totalWork;
        }
};

srm 535

标签:

原文地址:http://blog.csdn.net/mlzmlz95/article/details/46458335

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!