Educational Codeforces Round 131 (Rated for Div. 2)
作者:互联网
A. Grass Field
水
B. Permutation
题意
回想一下长度的排列n是一个数组,其中每个元素来自1至n恰好发生一次。
对于一个固定的正整数d,让我们定义排列的值为长度p[n]中 pi⋅ d=pi+1 的数量.
例如,如果d= 3和p = [ 5 , 2 , 6 , 7 , 1 , 3 , 4 ], 那么这种排列的值是2, 因为p2⋅ 3 =p3和p5⋅ 3 =p6.
对于给定的值n, 求长度的排列n和价值d以最大可能的成本(通过所有方式选择排列和d)。
如果有多个答案,则打印其中任何一个。
思路
显然d=2时有最大值,从1开始依次输出即可,注意避免重复
代码
#include <bits/stdc++.h> using namespace std; #define endl "\n" typedef long long ll; const ll N = 1e5, mod = 998244353; void solve() { int n; cin >> n; map<int, int> ma; cout << "2\n"; for (int i = 1; i <= n; i++) { if (ma[i] == 1) continue; for (int j = i; j <= n; j = j * 2) { if (ma[j] == 1) break; ma[j] = 1; cout << j << " "; } } cout << endl; } int main() { cin.tie(0), cout.tie(0); ios::sync_with_stdio(0); int T; cin >> T; while (T--) solve(); return 0; }
C. Schedule Management
题意
有n个工人和m个任务。工人编号从1至n. 每个任务都有一个精通该任务的工人。
每个任务都应该有一个工人分配给它。如果一个工人精通这项任务,需要1小时。否则需要2小时。
工人并行工作,彼此独立。每个工人一次只能完成一项任务。
将工作人员分配给所有任务,以便尽早完成任务。
工作在时间开始0. 完成所有任务的最短时间是多少?
思路
用一个数组s[n],记录第 i 工人有几个熟练的任务。
我用的方法是二分答案;
代码
#include <bits/stdc++.h> using namespace std; #define endl "\n" typedef long long ll; const ll N = 2e6 + 233, mod = 998244353; int s[N]; int n, m; int chack(int x) { ll a = 0, b = 0; for (int i = 1; i <= n; i++) { if (s[i] >= x) a += s[i] - x; else { int y = x - s[i]; b += y / 2; } } if (a > b) return 0; else return 1; } void solve() { cin >> n >> m; for (int i = 0; i <= m; i++) s[i] = 0; for (int i = 1; i <= m; i++) { int x; scanf("%d", &x); s[x]++; } int l = 1, r = m, mid = 0; int k = 0; while (l <= r) { mid = (r + l) >> 1; if (chack(mid)) { k = mid; r = mid - 1; } else { l = mid + 1; } } printf("%d\n", k); } int main() { // cin.tie(0), cout.tie(0); // ios::sync_with_stdio(0); int T; cin >> T; while (T--) solve(); return 0; }
标签:Educational,Rated,return,int,ll,Codeforces,long,cin,任务 来源: https://www.cnblogs.com/gosick-ll/p/16459998.html