首页 > 其他分享 >寒假训练2024/1/29

寒假训练2024/1/29

时间:2024-01-31 22:14:02浏览次数:22  
标签:cnt int 29 ne 2024 ++ second 寒假 dp

2024/1/29

codeforce 921

A - We Got Everything Covered!

题意:

输出一个字符串,使得所有前k个字母表示的长度为n的字符串都是这个字符串的子串。

思路:

这个题稍微猜想一下就可以,其实是个傻瓜题(为C题铺垫)。

把前k个字母,输出n遍就行。

#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve() {
	int n, k;
	cin >> n >> k;

	string s = "";
	for (int i = 0; i < k; i++) {
		s += 'a' + i;
	}

	for (int i = 0; i < n; i++) {
		cout << s;
	}
	cout << endl;
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int T = 1;
	cin >> T;

	while(T--) {
		solve();
	}

	return 0;
}

B - A Balanced 问题集et?

题意:

给x和n,把x拆成n个数,使得这n个数的gcd最大。

思路:

gcd最大,那就要使得这几个数拆分的尽可能均匀,那么就要找第一个大于等于n的x的因子。

划重点 : 求所有因子的数量的复杂度是根号n,

#include <bits/stdc++.h>
using namespace std;

#define int long long

void solve() {
	int x, n;
	cin >> x >> n;

	set<int>s;
	for (int i = 1; i * i <= x; i++) {
		if(x % i == 0) {
			s.insert(i);
			s.insert(x / i);
		}
	}

	int loc = x / n;
	auto res = s.lower_bound(loc);
	if(*res != loc) {
		res--;
	}

	cout << *res << endl;	
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int T = 1;
	cin >> T;

	while(T--) {
		solve();
	}

	return 0;
}

C - Did We Get Everything Covered?

题意:

与A题有关系,A是让你给出这个字符串,C是让你验证这个字符串,如果不是就给出反例。

题目描述的很复杂,简单来说就是给一个字符串,看是不是所有的由前k个字母组成的长度为n的字符串都能在给定的字符串中找到。

思路:

由A题我们得知,这个字符串必须有至少n块,每一块至少包含一遍前k个字符串,这样才符合条件。

验证的方法是这个,但是反例怎么举就想不到了。

我看了题解,题解很妙,对于每一块的前k个字母,开了一个数字外加一个计数器,如果计数器==n,重新计数,看是不是能记n轮。

对于反例,虽然不是很懂,但是能感觉到这样是对的。

把每一块中出现的最后一个字母拿出来,组合起来,把最后一轮没出现的字母补到后面补成n项,就是反例。

我猜测每块中取最后一个字母是保证唯一性把,因为最后一个字母能够保证在每一块中只出现了一遍。

#include <bits/stdc++.h>
using namespace std;

#define int long long
int vis[26];
void solve() {
	int n, k, m;
	cin >> n >> k >> m;

	string s;
	cin >> s;

	int cnt = 0;
	int res = 0;
	string ans = "";

	memset(vis, 0, sizeof(vis));
	for (auto c : s) {
		cnt += (!vis[c - 'a']);
		vis[c - 'a'] = 1;

		if(cnt == k) {
			cnt = 0;
			ans += c;
			if(++res == n) {
				break;
			}
			memset(vis, 0, sizeof(vis));
		}
	}
	
	if(res == n) {
		cout << "YES\n";
	}
	else {
		for (int i = 0; i < k; i++) {
			if(!vis[i]) {
				cout << "NO\n";
				while(ans.size() < n) {
					ans += (char)('a' + i);
				}
				cout << ans << endl;
				return ;
			}
		}
	}
}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int T = 1;
	cin >> T;

	while(T--) {
		solve();
	}

	return 0;
}

D. Good Trip

概率dp以后补

uva116

题意:

给一张图,你需要从第一列的某一个点开始走,走到最后一列,你的走法只能是右,右上和右下三种。要求路径和最小,如果有多条路径,求字典序最小的那个。

思路:

这个题是在简单的dp(求最小路径和)的基础上加上了路径。

很容易想到,我们设置前驱节点和值两个关键字,我们在dp更新路径的时候更新前驱节点就行。

我刚开始用的是$pair<int, int>[r][c]$ 的方式存储,存的是第一关键字存的是前驱节点,第二关键字是从第一列的某个点到这个点的最小路径和。

最后我们遍历最后一列找到最小路径和,沿着前驱节点向前遍历节点输出即可。

但是这样有几个问题,首先最小路径和可能有几个相同,我们必须都找到,然后比较最小字典序,输出。

交上去wa了。

找到测试样例我发现,我们这样找到的路径不一定是最小的,因为我们只关注了前驱节点而没有关注整条路的字典序,比如123和321在更新第四个节点的时候如果只关注前驱节点就会选择较大字典序的321,而123会被忽略。

最后改用$pair<string, int>[r][c]$ 的方式存,因为题目给的数据是10行100列,对于每一列我们都有一个前驱节点,前驱节点的范围是行数也就是10个,我们完全可以用数字字符0-9存储,最后转化输出,因为用字符串记录路径比价容易比较,但是如果用vector存储的话还要另外写比较i函数。

最后我们整理好细节,再调试一下就ok了。

#include <bits/stdc++.h>
using namespace std;

#define int long long
int arr[10][100];

void solve(int r, int c) {
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			cin >> arr[i][j];
		}
	}

	pair<string, int>dp[10][100];
	for (int i = 0; i < r; i++) {
		for (int j = 0; j < c; j++) {
			dp[i][j].second = 1e18;
			dp[i][j].first = "9999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999999";
		}
	}

	for (int i = 0; i < r; i++) {
		dp[i][0].second = arr[i][0];
		dp[i][0].first = "";
	}

	for (int j = 0; j < c - 1; j++) {
		for (int i = 0; i < r; i++) {
			for (int k = -1; k < 2; k++) {
				int ne = i + k;
				if(ne < 0) {
					ne = r - 1;
				}
				else if(ne >= r) {
					ne = 0;
				}
				if(dp[i][j].second + arr[ne][j + 1] < dp[ne][j + 1].second || (dp[i][j].second + arr[ne][j + 1] == dp[ne][j + 1].second && dp[i][j].first + (char)(i + '0') < dp[ne][j + 1].first)) {
					dp[ne][j + 1].second = dp[i][j].second + arr[ne][j + 1];
					dp[ne][j + 1].first = dp[i][j].first + (char)('0' + i);

				}
			}
		}
	}

	int minm = 1e18;
	for (int i = 0; i < r; i++) {
		if(dp[i][c - 1].second < minm) {
			minm = dp[i][c - 1].second;
		}
	}
	vector<int>num_v;
	for (int i = 0; i < r; i++) {
		if(dp[i][c - 1].second == minm) {
			num_v.push_back(i);
		}
	}

	auto f =[&](int num) {
		string s = "";
		int cnt = c - 1;
		int nr = num;
		for (; cnt >= 0; cnt--) {
			s.push_back(nr + '0');
			nr = dp[nr][cnt].first.back() - '0';
		}
		reverse(s.begin(), s.end());
		return s;
	};

	vector<string>ans;
	for (auto it : num_v) {
		ans.push_back(f(it));
	}
	sort(ans.begin(), ans.end());
	bool flag = 0;
	for (auto c : ans[0]) {
		if(flag) {
			cout << " ";
		}
		else {
			flag = 1;
		}
		cout << c - '0' + 1;
	}
	
	cout << endl << minm << endl;

}

signed main() {
	ios::sync_with_stdio(0);
	cin.tie(0), cout.tie(0);

	int r, c;

	while(cin >> r >> c) {
		solve(r, c);
	}

	return 0;
}

标签:cnt,int,29,ne,2024,++,second,寒假,dp
From: https://www.cnblogs.com/yyc4591/p/18000224

相关文章

  • 近期的感想与2024年的计划
    前言  2023年是我工作的第一年,到现在工作也有半年了,在工作的过程中有很多感悟,其中有关于技术的,也有关于为人处世的。首先是技术方面,工作半年也在不断地积攒经验,自己在团队协作中也有了一定的进步,知道了如何与人共同工作,技术提升上,做工程的经验也有了一定的进步,像git工具、docke......
  • CF292D Connexted Components
    原题传送门分析首先一眼看到这个题,第一个想到的肯定是dfs暴力每次询问时从左往右把边一条一条加进来,再从右往左加一遍,然后维护连通块个数。但是这样的复杂度显然是\(O(mk)\)的。所以我们需要一些优化。注意到在加边的时候有些边并不会改变连通块的个数。这些边我先称之为无......
  • 2024.1.31寒假每日总结22
    算法题:2670.找出不同元素数目差数组-力扣(LeetCode)①NLP(NaturalLanguageProcessing),也就是人们常说的「自然语言处理」,就是研究如何让计算机读懂人类语言,即将人的自然语言转换为计算机可以阅读的指令。②分词是NLP任务的一个起始,分词的好坏会影响整体模型的好坏。并且分......
  • 1.31寒假每日总结22
    1)NLP基本概念①NLP(NaturalLanguageProcessing),也就是人们常说的「自然语言处理」,就是研究如何让计算机读懂人类语言,即将人的自然语言转换为计算机可以阅读的指令。②分词是NLP任务的一个起始,分词的好坏会影响整体模型的好坏。并且分词不一样,语义不一样。1. 中国北京大......
  • Adobe2024最新版全家桶Ps、Pr、Ai、Ae、Au、Lrc、An直装版下载
    Adobe全家桶是Adobe公司开发的一套包括多个专业创意软件的综合性套装,涵盖了图形设计、影片制作、页面排版、音频编辑等多个创意领域。其中主要应用程序包括:Adobe2024全家桶Windows&Mac官方直装版AdobePhotoshop:图像处理和编辑软件,广泛用于照片修饰、合成和数字绘画。Ado......
  • 2024年Java面试题大全,带你突破技术瓶颈
    全套面试题已打包2024最全大厂面试题下载......
  • 2024年Java架构师面试宝典 图文并茂 10G面试题 请收藏
    全套面试题已打包2024最全大厂面试题下载点我Java基础知识在任何一个Java架构师的面试中,基础知识始终是不可或缺的部分。你需要确保对以下几个方面有深入的理解:集合框架:如何选择合适的集合类?HashMap和ConcurrentHashMap有什么区别?多线程与并发:synchronized和ReentrantLock的......
  • THUWC2024游寄
    THUWC2024游寄\(day\-1\)从学校坐车到巴蜀,第一次参加这种全国赛就碰上了在自己省举办,不能去外省玩,伤心,几百年没出过省了,不过如果去外省的费用堪忧,节省路费和食宿费了,发现巴蜀的大门居然是开放的,震惊,这样学生不是可以随意进出了???发现大门旁边还有一个银行和很多的饭店,更震惊了!这......
  • 数据库MySQL8.0.29安装与备份||了解和掌握MySQL的安装和简单使用和备份数据
    内容:了解和掌握MySQL的安装和简单使用:(1) 了解安装MySQL的软硬件环境和安装方法;(2) 熟悉MySQL的相关基本使用;(3) 熟悉MySQL的构成和相关工具;(4) 通过MySQL的使用来理解数据库系统的基本概念。要求:1. 在微机上安装MySQL数据库系统,为后续实验搭建实验环境,提供前期准备;2. 完成实......
  • 我在2024年的第一个月
    找实习历程  迈入大三,我逐渐意识到实习的重要性,便也计划着在期末考试完之后开始准备简历和面试相关的内容。奈何考完试已经一月五号了,然后填写简历,准备面试技巧以及拍证件照等事情又拖了好几天,再加上寒假实习一般是在去年十一二月份机会比较多一些,这个时间点简直是debuff拉满了......