Codeforces Round #610 (Div. 2) 题解
Posted jiaaaaaaaqi
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Codeforces Round #610 (Div. 2) 题解相关的知识,希望对你有一定的参考价值。
Temporarily unavailable
[
Time Limit: 1 squad 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
", ans-over);
}
return 0;
}
K for the Price of One (Hard Version)
[
Time Limit: 2 squad 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
", ans);
}
return 0;
}
Petya and Exam
[
Time Limit: 2 squad 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 ? '
':' ');
// for(int i=1; i<=n; i++) printf("%d%c", node[i].b, i==n ? '
':' ');
// for(int i=1; i<=n; i++) printf("%d%c", p[i], i==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
", ans);
}
return 0;
}
!-->!-->以上是关于Codeforces Round #610 (Div. 2) 题解的主要内容,如果未能解决你的问题,请参考以下文章
Codeforces Round #610 (Div. 2)E(模拟,DFS)
Codeforces Round #610 (Div. 2) a/b/c
Codeforces Round #610 (Div. 2).K for the Price of One (Hard Version)
Codeforces Round #730 (Div. 2) C. Need for Pink Slips(概率,模拟....)