Educational Codeforces Round 131 (Rated for Div. 2) A —— C
作者:互联网
A. Grass Field
解决代码:
void solve()
{
int a, b, c, d;
cin >> a >> b >>c >>d;
int cnt = 0;
cnt = a + b +c + d;
if(cnt == 0) cout << 0 << endl;
else if(cnt == 4) cout << 2 << endl;
else cout << 1 << endl;
}
B. Permutation
思路:首先理解题意可知,1不可能作为d,而要想尽可能多的满足条件只有d越小越好,于是2就是最佳选择。从1开始输出其2的倍数,即可。
解决代码:
void solve()
{
int n;
cin >> n;
cout << 2 <<endl;
memset(st, 0, sizeof(st));
for(int i = 1; i <= n;i ++)
{
if(st[i]) continue;
int j = i;
while(j <= n && !st[j])
{
cout << j << ' ';
st[j] = 1;
j *= 2;
}
}
cout << endl;
}
C. Schedule Management
思路来源:https://zhuanlan.zhihu.com/p/539664374
假设在时间tn个工人恰好能做完m个工作,那么大于t的时间肯定能做完,小于t的时间必然不能做完。如此,时间就具有单调性,可用二分解法。
因为最少需要一个小时,而最大时间就是每个工人做的都不是自己擅长的工作,需要花费m * 2的时间,如此,l = 1, r = 2 * m。
关于check,只有在当前时间下所有工人都能做完m个工作才算true,否则是false,找到最小需要的时间即可。
sum是完不成的任务,tmp是有剩余时间的工人可以帮助完成的任务数。当sum <= tmp即为判正条件。
map<int, int> mp;
int n, m;
bool check(int t)
{
int sum = 0, tmp = 0;
for(int i = 1; i <= n; i ++)
{
if(mp[i] > t) sum += mp[i] - t;
else tmp += (t - mp[i]) / 2;
}
return sum <= tmp;
}
void solve()
{
mp.clear();
cin >> n >> m;
for(int i = 1; i <= m; i++)
{
int x;
cin >> x;
mp[x] ++;
}
int l = 1, r = m * 2, mid;
while(l < r)
{
mid = (l + r) >> 1;
if(check(mid)) r = mid;
else l = mid + 1;
}
cout << l << endl;
}
标签:Educational,Rated,cout,int,sum,mid,Codeforces,mp,cnt 来源: https://www.cnblogs.com/lbzbk/p/16460590.html