首页 > 其他分享 >牛客小白月赛94

牛客小白月赛94

时间:2024-05-28 17:43:49浏览次数:13  
标签:res int vi cin 牛客 vector 小白月赛 using 94

A - 小苯的九宫格

#include <bits/stdc++.h>

using namespace std;

int main(){
	vector<int> a(11);
	for(int i = 1; i <= 9; i ++) cin >> a[i];
	string s;
	cin >> s;
	for(auto i : s)
		cout << a[i - '0'];
    return 0;
}

B - 小苯的好数组

如果原数组不是好数组,则原数组的任意子序列都一定不是好数组。所以如果原数组是好数组,原数组就是最长的子序列。

#include <bits/stdc++.h>

using namespace std;

using vi = vector<int>;

int main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;
	vi a(n);
	for(auto & i : a) cin >> i;
	if(is_sorted(a.begin(), a.end()))
		cout << 0;
	else 
		cout << n;
}

C - 小苯的数字合并

最优解一定是把前缀合并成一个或者把后缀合并成一个。所以可以提前前缀和预处理一下,然后枚举前缀或后缀的长度。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;

#define int long long

using vi = vector<int>;

i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;
	vi a(n);
	for(auto & i : a) cin >> i;
	
	vi preMax(n), preMin(n), pre(n);
	preMax[0] = preMin[0] = pre[0] = a[0];
	for(int i = 1; i < n; i ++) {
		preMax[i] = max(preMax[i - 1], a[i]);
		preMin[i] = min(preMin[i - 1], a[i]);
		pre[i] = pre[i - 1] + a[i];
	}	

	vi sufMax(n), sufMin(n), suf(n);
	sufMax[n - 1] = sufMin[n - 1] = suf[n - 1] = a[n - 1];
	for(int i = n - 2; i >= 0; i --) {
		sufMax[i] = max(sufMax[i + 1], a[i]);
		sufMin[i] = min(sufMin[i + 1], a[i]);
		suf[i] = suf[i + 1] + a[i];
	}

	int res = sufMax[0] - sufMin[0];

	for(int i = 1; i < n; i ++) 
		res = max(res, max(preMax[i - 1], suf[i]) - min(preMin[i - 1], suf[i]));
	for(int i = n - 2; i >= 0; i --)
		res = max(res, max(sufMax[i + 1], pre[i]) - min(sufMin[i + 1], pre[i]));

	cout << res << "\n";
	return 0;
}

D - 小苯的排列构造

首先,如果合法,则\(a_{i-1}\)一定是\(a_i\)的约数。

然后可以得到一个结论:如果若干个数\(x_j\)满足\(\gcd(a_{i-1},x_j) = a_i\),则第\(i\)位填谁没有影响。所以可以贪心的选择最小值,我们可以用双端队列来维护当前剩下了哪些数。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;

using vi = vector<int>;

i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n;
	cin >> n;
	vi a(n), p(n);
	for(auto & i : a) cin >> i;
	deque<int> q;
	p[0] = a[0];
	for(int i = 1; i <= n; i ++) 
		if(i != p[0]) q.push_back(i);
	for(int i = 1; i < n; i ++) {
		if(a[i-1] % a[i] != 0) {
			cout << "-1\n";
			return 0;
		}
		int fail = 0;
		while(gcd(a[i - 1], q.front()) != a[i]) {
			q.push_back(q.front()), q.pop_front();
			fail ++;
			if(fail > q.size()) {
				cout << "-1\n";
				return 0;
			}
		}
		p[i] = q.front(), q.pop_front();
	}
	for(auto i : p) cout << i << " ";
	return 0;
}

E/F - 小苯的01背包

这题和 普通背包的最大区别就是,普通背包选的物品越多,总体积和总价值一定递增,但是本题是递减。

考虑到依旧是求解最大价值,我们可以枚举价值然后求解最小体积。

我们枚举了价值\(s\),物品\(i\)能够被选择的条件是\((s \& a_i) = s\)。对于所有可以被选择的物品,我们一定是全选最优。

这样的话,对于easy版本,我们可以暴力的枚举价值就好了。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;

using vi = vector<int>;

const int N = (1 << 11) - 1;

i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, k;
	cin >> n >> k;
	vi v(n), w(n);
	for(int i = 0; i < n; i ++) 
		cin >> v[i] >> w[i];
	for(int i = N, tmp; i > 0; i --) {
		tmp = N;
		for(int j = 0; j < n; j ++) 
			if((i & w[j]) == i) tmp &= v[j];
		if(tmp <= k) {
			cout << i << "\n";
			return 0;
		}
	}
	cout << "0\n";
	return 0;
}

对于hard 版本,我们无法再枚举价值,我么可以考虑试填法。

#include <bits/stdc++.h>

using namespace std;

using i32 = int32_t;

using vi = vector<int>;

const int N = (1 << 11) - 1;

i32 main(){
	ios::sync_with_stdio(false), cin.tie(nullptr);
	int n, k;
	cin >> n >> k;
	vi v(n), w(n);
	for(int i = 0; i < n; i ++) 
		cin >> v[i] >> w[i];
	
	int res = 0;
	for(int i = 30; i >= 0; i --){
		int tryRes = res | (1 << i), tmp = 0x7fffffff;
		for(int j = 0; j < n; j ++)
			if((tryRes & w[j]) == tryRes) tmp &= v[j];
		if(tmp <= k) res = tryRes;
	}
	cout << res << "\n";
	return 0;
}

标签:res,int,vi,cin,牛客,vector,小白月赛,using,94
From: https://www.cnblogs.com/PHarr/p/18218556

相关文章

  • Codeforces Round 948 (Div. 2)
    A.LittleNikita题意:\(n\)步操作,\(+1\)或\(-1\),最终结果是否等于\(m\)思路:设\(+1\)的操作次数为\(x\),\(-1\)的操作次数为\(y\)\[x+y=n\\x-y=m\]\[x=(n+m)/2\\y=(n-m)/2\]\((n-m)\)和\((n+m)\)均为偶数,即\(n\)和\(m\)均为偶数或同为奇数,且\(n>=m\)代码:voidsolve()......
  • Codeforces Round 948 (Div. 2) B - C
    总结:做了A,B,然后开局A看错题wa了一发,B出的又很慢,所以掉大分。总的来说还是c没开出来。B.BinaryColouring1.题目大意:给你一个int范围内的数x,要求构造一个二进制串,能有-1、1、0,二进制串的值不能出现两个连续的地方不为0,二进制串的值要等于x。2.思路分析:我们可以发现,对于x的......
  • codeforces round 948(div.2)
    https://m1.codeforces.com/contest/1977A:题意:小男孩尼基塔得到了一些立方体作为礼物。他决定用它们建一座塔。一开始,塔上没有任何立方体。在一次移动中,尼基塔要么正好把1 个立方体放到塔顶,要么正好从塔顶移走1个立方体。有没有可能在走了n 步之后,塔顶正好有m 个立......
  • 5.26牛客循环结构
    1002.难点:两层循环条件设置思路可以设置三个变量代码1003思路:与星号双塔差不多,在此基础上加大一点难度每日练题5.23(EOF用法)-CSDN博客代码......
  • 牛客周赛 Round 44 (小白历险记)
    A.唐龙守则题意:每三张撤回一张,给你n张能删除多少张思路:n/3Code:n=int(input())print(n//3)B.最大公约题意:序列中最大值和最大公约数相等其实等价于问最长的相同元素有多少思路:map储存元素统计个数最大值Code:#include<bits/stdc++.h>usi......
  • Codeforces Round #947 题解 (A~G)
    目录A.BazokaandMocha'sArrayB.378QAQandMocha'sArrayC.ChamoandMocha'sArrayD.PainttheTreeE.ChainQueriesF.SetG.ZimphaFanClubA.BazokaandMocha'sArray枚举每个循环移位判断.B.378QAQandMocha'sArray首先最小的数肯定得选,删掉最小的数的倍数......
  • Codeforces Round 947 (Div. 1 + Div. 2) E. Chain Queries
    本来决定开摆养生不打的,但11点半的时候点进去看到这个题是个疑似DS,写题的欲望瞬间高涨,然后就40min写了这个题然而赛中并不能提交,只好等到第二天早上再交一发,没想到还WA了一发才过首先这题如果我们能确定当前黑色点集的链的两个端点\(x,y\)的话,这个题就非常显然了只需要求出\((x......
  • 【C++】牛客 ——DP36 abb
    ✨题目链接:DP36abb✨题目描述 leafee最近爱上了abb型语句,比如“叠词词”、“恶心心”leafee拿到了一个只含有小写字母的字符串,她想知道有多少个"abb"型的子序列?定义:abb型字符串满足以下条件:字符串长度为3。字符串后两位相同。字符串前两位不同。✨输入......
  • 牛客热题:包含min函数的栈
    ......
  • Codeforces Round 947 (Div. 1 + Div. 2)
    Solve:A~ERank:425Rating:\(1744+195=1939\)(\(1894+95=1989\))发挥评价:Normal本场问题:E先WAon4,较快找出问题后修改WAon27,就又急了(重现上午),开始怀疑做法正确性未果,结果1h后才发现是代码出现问题。注意先检查代码漏洞而不是先怀疑正确性(尤其是错在后面时候,要是正......