2023CCPC河南省赛暨河南邀请赛个人补题ABEFGHK

Dashboard - 2023 CCPC Henan Provincial Collegiate Programming Contest - Codeforces

过题难度:A H F G B K E

铜奖: 2 339

银奖: 3 318

金奖: 5 523

A:

直接模拟

cpp 复制代码
// Code Start Here	
	int t;
	cin >> t;
	while(t--){
		string s;
		cin >> s;
		set<char> seen;
		bool found = false;		
		for (int i = 1; i < sz(s); ++i) {
			bool ok = true;
			seen.clear();
			for (int j = 0; j < i; ++j) {
				if (seen.count(s[j])) {
					ok = false;
					break;
				}
				seen.insert(s[j]);
			}
			if (!ok) continue;
			int l = i, r = sz(s) - 1;
			while (l < r) {
				if (s[l] != s[r]) {
					ok = false;
					break;
				}
				++l;
				--r;
			}
			if (ok) {
				found = true;
				break;
			}
		}
		cout << (found ? "HE\n" : "NaN\n");
	}

H

思路:我们发现0.5会进位,而距离0.5无穷左边就会被舍去,因此最小的方式是分出来的尽量距离0.5差一点点,最多的就是0.5

cpp 复制代码
// Code Start Here	
	int t;
	cin >> t;
	while(t--){
		int n , k;
		cin >> n >> k;
		if(k > 2 * n)cout << 0 << " " << 2 * n <<endl;
		else{
			int minv = (2 * n - k + 2) / 2;
			int maxv = minv + k - 1;
			cout << minv << " " << maxv << endl;
		}
	}

F

题意:

给定一个数列A从中选出 k 个数,计算:这些数的最大值-最小值,记作 max。这些数相邻差值中的最小值,记作 min。要求使max×min 最小

思路:我们发现排序后,任意 k 个数如果不连续,选中其中的最大和最小值之差一定不会比连续的更小。同时,相邻差值的最小值如果跳着选,差值可能会变大,而连续的差值是最稳定的。

对于连续的 k 个数,max=Ai+k−1−Ai。假设有k−1 个相邻差值,存在差分数组 diff,使得diffj=Aj+1−Aj。连续区间 i, i+k-1 中,相邻差值的最小值就是min=min(diffi,diffi+1,...,diffi+k−2)。

因此我们可以遍历所有可能的连续 k 个数区间,求:每个区间内max×min,然后取最小值

考虑到5e5的数据规模,我们使用单调队列维护区间内差值的最小值。在O(1) 时间内取当前窗口最小值,且在移动窗口时自动维护单调性,效率是O(n)。

cpp 复制代码
// Code Start Here	
	int n , k;
	cin >> n >> k;
	vector<int> a(n);
	for(int i = 0;i<n;i++)cin >> a[i];
	sort(all(a));
	vector<int> diff(n-1);
	for(int i = 0;i<n-1;i++)diff[i] = a[i+1] - a[i];
	
	int ans =  1e18;
	deque<int> dq;
	for(int i = 0;i<n;i++){
		if(i > 0){
			while(!dq.empty() && diff[i-1] <= diff[dq.back()])dq.pop_back();
			dq.push_back(i - 1);
		}
		if(i >= k){
			if (!dq.empty() && dq.front() < i - k)dq.pop_front();
		}
		if(i >= k-1){
			int max_v = a[i] - a[i-k+1];
			int min_v = 1e9;
			if(k > 1 && !dq.empty() )min_v = diff[dq.front()];
			if(k == 1)min_v = 1e9;
			ans = min(ans , 1LL *max_v * min_v);
		}
	}
	cout << ans << endl;
	return 0;

GBKE睡醒补

相关推荐
啵啵啵鱼2 分钟前
第二章 线性表
java·数据结构·算法
虾..6 分钟前
计算机图形学:几何表示
算法
微三云 - 廖会灵 (私域系统开发)7 分钟前
供应链系统实战:多渠道订单聚合与分布式库存一致性方案总结
开发语言·分布式·php
局部有解17 分钟前
Hot100 - 三数之和
数据结构·c++·算法
辉艺棉麻小张18 分钟前
用 JSON 建模面料规格:成分、克重、支数与公定回潮率字段设计
数据结构
学逆向的33 分钟前
C 数据溢出与精度丢失
c语言·开发语言·网络安全
longlongzihan34 分钟前
C++ 常用数据结构速查:vector、stack、queue、list、树、图、哈希表等声明与核心操作
数据结构·c++·list
思茂信息1 小时前
CST技术案例:加载正弦曲线的平面螺旋天线仿真研究
算法·平面·emc·cst·电磁仿真·仿真辐射
嫂子开门我是_我哥1 小时前
敏感性分析
算法·机器学习·论文笔记
别动我齐刘海1 小时前
实时控制学习2
linux·c++·人工智能·学习·算法