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

Codeforces Round #610 (Div. 2) 题解

时间:2019-12-25 23:45:54      阅读:119      评论:0      收藏:0      [点我收藏+]

标签:span   pair   sizeof   str   tac   cout   vector   两种   ace   

Temporarily unavailable

\[ Time Limit: 1 s\quad Memory Limit: 256 MB \]
直接计算出 \([c-r, c+r]\)\([a, b]\) 中的范围有多大,然后减掉就可以了。


view

#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define  lowbit(x)  x & (-x)
#define  mes(a, b)  memset(a, b, sizeof a)
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>

typedef unsigned long long int ull;
typedef long long int ll;
const int    maxn = 1e5 + 10;
const int    maxm = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;
using namespace std;

int n, m;
int cas, tol, T;

int main() {
    scanf("%d", &T);
    while(T--) {
        ll a, b, c, r, ans;
        scanf("%lld%lld%lld%lld", &a, &b, &c, &r);
        if(a>b) swap(a, b);
        ans = b-a;
        ll over = max(a, min(c+r, b)) - min(b, max(c-r, a));
        printf("%lld\n", ans-over);
    }
    return 0;
}

K for the Price of One (Hard Version)

\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
首先肯定是买最便宜的,由于有 \(k\) 个只能买 \(k\) 个,所以可以看成有两种策略,买 \(1\) 个和买 \(k\) 个,然后用 \(dp[i]\) 表示买了前 \(i\) 个物品的最少花费,然后看给出的钱可以买多少个。


view

#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define  lowbit(x)  x & (-x)
#define  mes(a, b)  memset(a, b, sizeof a)
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
 
typedef unsigned long long int ull;
typedef long long int ll;
const int    maxn = 2e5 + 10;
const int    maxm = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;
using namespace std;
 
int n, m, k;
int cas, tol, T;
 
ll dp[maxn];
int a[maxn];
 
int main() {
    scanf("%d", &T);
    while(T--) {
        scanf("%d%d%d", &n, &m, &k);
        for(int i=1; i<=n; i++) scanf("%d", &a[i]);
        for(int i=1; i<=n; i++) dp[i] = INF;
        dp[0] = 0;
        sort(a+1, a+1+n);
        for(int i=1; i<=n; i++) {
            if(i-k>=0)
                dp[i] = min(dp[i-1], dp[i-k])+a[i];
            else
                dp[i] = dp[i-1]+a[i];
        }
        ll ans = 0;
        for(int i=n; i>=1; i--) {
            if(dp[i] <= m) {
                ans = i;
                break;
            }
        }
        printf("%lld\n", ans);
    }
    return 0;
}

Petya and Exam

\[ Time Limit: 2 s\quad Memory Limit: 256 MB \]
由于有一个限制时间 \(t_i\),那么我可以按限制时间 \(t_i\) 排序来完成每一个作业。

\(p[i]\) 表示完成 \(i\) 个作业需要的时间,那么我想要完成这 \(i\) 个作业,我所用的时间必须在 \(t_{i+1}\) 以内,这些是必须要完成的作业。

接下来还有一部分剩下的时间,我可以用这些剩余的时间去贪心完成还没到达限制时间的作业,每次先完成简单的,在完成难的。


view

#include <map>
#include <set>
#include <list>
#include <ctime>
#include <cmath>
#include <stack>
#include <queue>
#include <cfloat>
#include <string>
#include <vector>
#include <cstdio>
#include <bitset>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <unordered_map>
#define  lowbit(x)  x & (-x)
#define  mes(a, b)  memset(a, b, sizeof a)
#define  fi         first
#define  se         second
#define  pb         push_back
#define  pii        pair<int, int>
 
typedef unsigned long long int ull;
typedef long long int ll;
const int    maxn = 2e5 + 10;
const int    maxm = 1e5 + 10;
const ll     mod  = 1e9 + 7;
const ll     INF  = 1e18 + 100;
const int    inf  = 0x3f3f3f3f;
const double pi   = acos(-1.0);
const double eps  = 1e-8;
using namespace std;
 
ll n, m;
int cas, tol, T;

struct Node {
    ll a, b, p;
    bool operator < (Node c) const {
        return b<c.b;
    }
} node[maxn];
ll p[maxn], a[2];

ll solve(ll time, ll x, ll y) {
    ll cnt = 0;
    ll oka = min(x, time/a[0]);
    cnt += oka;
    time -= oka*a[0];
    ll okb = min(y, time/a[1]);
    cnt += okb;
    return cnt;
}

int main() {
    scanf("%d", &T);
    while(T--) {
        scanf("%lld%lld%lld%lld", &n, &m, &a[0], &a[1]);
        for(int i=1, x; i<=n; i++) {
            scanf("%lld", &node[i].p);
            node[i].a = a[node[i].p];
        }
        for(int i=1; i<=n; i++) {
            scanf("%lld", &node[i].b);
        }
        p[0] = 0;
        sort(node+1, node+1+n);
        node[n+1].b = m+1;
        for(int i=1; i<=n; i++) p[i] = p[i-1]+node[i].a;
        ll ans = 0, cnt[2] = {0};
//      for(int i=1; i<=n; i++) printf("%d%c", node[i].a, i==n ? '\n':' ');
//      for(int i=1; i<=n; i++) printf("%d%c", node[i].b, i==n ? '\n':' ');
//      for(int i=1; i<=n; i++) printf("%d%c", p[i], i==n ? '\n':' ');
//      cout << "=====" << endl;
        for(int i=n; i>=0; i--) {
            if(p[i] < node[i+1].b)
                ans = max(ans, i+solve(node[i+1].b-p[i]-1, cnt[0], cnt[1]));
            cnt[node[i].p]++;
        }
        printf("%lld\n", ans);
    }
    return 0;
}

Codeforces Round #610 (Div. 2) 题解

标签:span   pair   sizeof   str   tac   cout   vector   两种   ace   

原文地址:https://www.cnblogs.com/Jiaaaaaaaqi/p/12099360.html

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