ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

Educational Codeforces Round 131 (Rated for Div. 2) A —— C

2022-07-10 11:37:56  阅读:191  来源: 互联网

标签:Educational Rated cout int sum mid Codeforces mp cnt


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

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有