首页 > 其他分享 >1.4 vp Codeforces Round #838 (Div. 2)

1.4 vp Codeforces Round #838 (Div. 2)

时间:2023-01-04 15:56:26浏览次数:44  
标签:1.4 tmp cin int 838 元素 Codeforces mid push

A - Divide and Conquer

题意:给出序列a,设b为a中元素总和。你可以选择a中任意元素,将它除以二(向下取整)。问最少需要多少次可以使b为偶数
思路:将a划分为奇偶两个集合。a中偶数元素的数量是奇是偶对题目没有影响,要使b为偶数,需要知道奇数元素的个数
若奇数元素是偶数,则b一开始就是偶数,输出0
否则
1.对于奇数集合中每个元素进行操作,找出可以使一个元素变成偶数需要的最少操作x
2.对于偶数集合中每个元素进行操作,找出可以使一个元素变成奇数需要的最少操作y
ans = min(x,y)

const int N = 50 + 10, M = 5010, INF = 2e9, MOD = 1e9 + 7;
int a[N];
 
//注意观察N的大小
void solve() {
	int n;
	cin >> n;
	int cnt0 = 0, cnt1 = 0;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i];
		if (a[i] % 2 == 1) cnt1 ++;
		else cnt0 ++;
	}
	
	if (cnt1 % 2 == 0) {
		cout << 0 << endl;
	}else {
		int ans = 1e9;
		for (int i = 1; i <= n; i ++) {
			if (a[i] % 2 == 1) {
				int t = 0;
				while (a[i] % 2 != 0) {
					t ++;
					a[i] /= 2;
				}
				ans = min(ans, t);
			}else {
				int t = 0;
				while (a[i] % 2 != 1) {
					t ++;
					a[i] /= 2;
				}
				ans = min(ans, t);
			}
		}
		
		cout << ans << endl;
	}
}

B - Make Array Good

题意:给出序列a,你可以进行操作,每次操作可以使a中一个元素加上小于等于它的一个数x,(x>0)。要求操作数不超过n,且要输出最终操作次数和每次操作的下标和x
思路:找到序列中最小的元素mina,然后后面元素都以它为最小因子进行增添即可。若a中存在mina的倍数或者存在某元素操作后为mina的倍数,则将mina更新为较大的那个。

const int N = 1e5 + 10, M = 5010, INF = 2e9, MOD = 1e9 + 7;
PII a[N];
 
//注意观察N的大小
void solve() {
	int n;
	cin >> n;
	for (int i = 1; i <= n; i ++) {
		cin >> a[i].first;
		a[i].second = i;
	}
	sort(a + 1, a + 1 + n);
	int tmp = a[1].first;
	vector<PII> ans;
	for (int i = 2; i <= n; i ++) {
		if (a[i].first % tmp == 0) {
			if (a[i].first > tmp) tmp = a[i].first;
		}else {
			int t = a[i].first / tmp;
			int x = tmp * (t + 1) - a[i].first;
			tmp = tmp * (t + 1);
			ans.push_back({a[i].second, x});
		}
	}
	
	cout << ans.size() << endl;
	for (auto [x, y] : ans) cout << x << ' ' << y << endl;
}

C. Binary Strings are Fun

题意:给出一个二进制字符串,你可以将它“扩充”,即在每个元素中间增加一个二进制数(0/1),若ai在(1,i)上是中位数,那么说这个前缀是好的。问从(1,n)中将其扩充后可以有多少好的前缀
思路:找规律。如01,10这类,中间若要扩充只可能有一种情况,而11,00这类可以有两种情况。前面已经确定的序列对后面也有影响。

void solve() {
	int n;
	cin >> n;
	string s;
	cin >> s;
	LL sum = 1, tmp = 1;                                  //方案总数sum,过程方案数tmp
	for (int i = 1; i < s.size(); i ++) {
		int x = s[i - 1] - '0', y = s[i] - '0';
		if (x != y) tmp = 1;                         //如果相邻两个数不相同,那么从开始到当前位置仅有一种可能的方案
		else tmp *= 2;                               //若相同,那么方案数乘以当前位置扩充的可能
		sum += tmp;
		sum %= MOD;
		tmp %= MOD;
	}
	
	cout << sum << endl;
}
 

D - GCD Queries

题意:交互题,给出一个n,代表有一个含有n个数字的排列。这个排列是隐藏的,需要通过交互找到数字0的位置。每次提问给出两个数的下标,会回答这两个数的gcd,若这两个数:x,y中有一个为0则可以输出
思路:直接去找到0很难,那可以用排除法,将不是0的数字排除,剩下的就只有0
设有下标l, mid, r。每次进行两次询问x = gcd(l, mid), y = gcd(mid, r)。
若x == y,则mid所代表的元素绝不可能为0
若x > y,则x所代表的元素不可能为0,
若y > x,则y所代表的元素不可能为0.

ps:如果关了同步流需要注释掉这部分,否则会出现

void ask(int x, int y) {
	cout << "? " << x << " " << y << endl;
}
 
//注意观察N的大小
void solve() {
	int n;
	cin >> n;
	queue<int> q;
	for (int i = 1; i <= n; i ++) q.push(i);
	while (q.size() > 2) {
		int l = q.front();
		q.pop();
		int r = q.front();
		q.pop();
		int mid = q.front();
		q.pop();
		ask(l, mid);
		int x, y;
		cin >> x;
		ask(mid, r);
		cin >> y;
		if (x == y) {
			q.push(l);
			q.push(r);
		}else if (x > y) {
			q.push(l);
			q.push(mid);
		}else {
			q.push(r);
			q.push(mid);
		}
	}
	
	int x, y;
	x = q.front(), q.pop();
	y = q.front(), q.pop();
	cout << "! " << x << " " << y << endl;
	cin >> n;
}

总结:这四道题出现了两道构造,一道计数类,一道交互。感觉构造类有些想法,无非划分集合,根据题目特性找到数据关联之类的。计数类问题也需要分类讨论,然后累加。交互类问题很薄弱,拿到手基本没什么思路,其实只需要直指问题核心即可。

标签:1.4,tmp,cin,int,838,元素,Codeforces,mid,push
From: https://www.cnblogs.com/lbzbk/p/17025079.html

相关文章

  • Codeforces Hello 2023 CF 1779 A~F 题解
    点我看题A.HallofFame先把不用操作就合法的情况判掉。然后发现交换LL,RR,RL都是没用的,只有交换LR是有用的,这样可以照亮相邻的两个位置。所以我们就是要找到一个位置i,......
  • Codeforces Hello 2023 CF 1779 A~F 题解
    点我看题A.HallofFame先把不用操作就合法的情况判掉。然后发现交换LL,RR,RL都是没用的,只有交换LR是有用的,这样可以照亮相邻的两个位置。所以我们就是要找到一个位置i,......
  • [leetcode每日一题]1.4
    ​​1802.有界数组中指定下标处的最大值​​难度中等给你三个正整数 ​​n​​、​​index​​ 和 ​​maxSum​​ 。你需要构造一个同时满足下述所有条件的数组 ​......
  • CodeForces 991C Candies(二分答案)
    CodeForces991CCandies(二分答案)http://codeforces.com/problemset/problem/991/C    题意:给出一个数n,表示有n块蛋糕,有两个人a,b。a每次可以取k块蛋糕(如果剩下......
  • 1.3 vp Educational Codeforces Round 139 (Rated for Div. 2)
    A-ExtremelyRound题意:给出n,找出从1到n中,只出现过一次非0数字的数思路:一开始以为是暴力,wa了一发老老实实找规律。就是找最高位,最高位是几,就有几个,再加上,每多一位要加9......
  • 洛谷P8838 [传智杯 #3 决赛] 面试(害 刚开始,没想到用dfs 呜呜呜)
    这道题其实不算难,但是我没有想到用dfs,害,,难受。其次这个题,我看了大佬的代码,找到答案后直接exit(0),直接退出,而不是利用return一层层返回。其实这个题就是利用dfs求出每种......
  • Codeforces Round #838 (Div. 2) A--C
    ​​https://codeforces.com/contest/1762​​A.DivideandConquer分析:数组所有元素和为偶数则为good。那么肯定要考虑奇偶性问题。1.如果和直接==偶数,那cout<<0;2.但是......
  • Codeforces Round #750 E
    E.PchelyonokandSegments题链我们可以发现答案最多是sqrt(2n)个也就是500个考虑dpdp[i][j]表示前i个分成了j段且第j段的max转移就是dp[i][j]=max{dp[i][j],s[i......
  • Educational Codeforces Round 139 vp记
    被Jerry__Jiang神爆杀的一天EducationalCodeforcesRound139vp记ProblemA简单题,随便枚举下即可Code#include<bits/stdc++.h>#defineintlonglong#define......
  • [概率论与数理统计]笔记:1.4 条件概率
    1.4条件概率条件概率样本空间\(\Omega\)事件\(A,B\)\(P(B)>0\)在事件\(B\)已经发生的前提条件下,事件\(A\)发生的概率称为A对B的条件概率:\(P(A|B)\).通常,\(P(A)\)......