其他分享
首页 > 其他分享> > Educational Codeforces Round 131 (Rated for Div. 2) A —— C

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