首页 > 其他分享 >2024年7月上海月赛乙组

2024年7月上海月赛乙组

时间:2024-08-16 10:37:30浏览次数:7  
标签:月赛 return int 乙组 long 2024 step str push

幂的运算

题目:给定a, b, c, 求 \(a^{b}\) mod c。

分析:快速幂板子题

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
long long n, m, k;
long long ksm(long long a, long long b, long long p) {
	long long ans = 1;
	while (b) {
		if (b & 1) ans = ans * a % p;
		a = a * a % p;
		b >>= 1;
	}
	return ans;
}
int main(){
	cin >> n >> m >> k;
	cout << ksm(n, m, k) << endl;
	return 0;
}

选举快报

题目:每次给定一个提名的候选者的名字,输出当前候选者出现次数最多的名字,相同输出字典序排名靠前的候选者。

分析:优先队列实时维护,map映射字符串对应数量

代码:

#include <bits/stdc++.h>
using namespace std;
const int N = 2e5 + 10;
int n, m, k;
string str;
struct node {
	int x;
	string name;
	bool operator < (const node& a) const {
		if (x == a.x)
			return name > a.name;
		return x < a.x;
	}
};
priority_queue<node> q;
map<string, int> ma;
int main(){
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> str;
		ma[str]++;
		q.push({ma[str], str});
		cout << q.top().name << endl;
	}
	return 0;
}

倒水问题

题目:三个没有刻度的杯子,容量分别为 a 升、b 升与 c 升。一开始,只有容量为 c 的杯子中灌满了水,另外两个杯子是空的。可以将水从一个杯子倒去另一个杯子,倒水过程直到原杯子变空或新杯子变满才会停止。水只能在杯子间转移,不会凭空增加或减少。请输出最少能有多少水可以出现在某个杯子里,并输出最少需要多少步才能达到这一目的。

分析:a,b,c范围5000内,看数据才时间复杂度\(O(n^{2})\),三个杯子,两个杯子装的水确定了,第三个杯子装的水就也确定了,状态暴力转移,有水就可以转移,转移分为可能装满,和装不满,分类清楚即可。

代码:

#include<bits/stdc++.h>
using namespace std;
int n, m, k;
int ans = 5001, cnt;
struct node {
	int a, b, c, step;
}; 
bool f[5010][5010];
queue<node> q;
int main(){
	cin >> n >> m >> k;
	q.push({0, 0, k, 0});
	while (!q.empty()) {
		node x = q.front();
		q.pop();
		int a = x.a, b = x.b, c = x.c, step = x.step;
		if (a && a < ans) {
			ans = a;
			cnt = step;
		}
		if (b && b < ans) {
			ans = b;
			cnt = step;
		}
		if (c && c < ans) {
			ans = c;
			cnt = step;
		}
		if (a) {
			if (a + b >= m && !f[a+b-m][m]) {
				f[a+b-m][m] = true;
				q.push({a+b-m, m, c, step+1});
			}
			else if (a + b < m && !f[0][a + b]) {
				f[0][a+b] = true;
				q.push({0, a+b, c, step+1});
			}
			if (!f[0][b]) {
				f[0][b] = true;
				q.push({0, b, c + a, step + 1});
			}
		}
		if (b) {
			if (a + b >= n && !f[n][a + b - n]) {
				f[n][a + b - n] = true;
				q.push({n, a + b - n, c, step+1});
			}
			else if (a + b < n && !f[a + b][0]) {
				f[a+b][0] = true;
				q.push({a+b, 0, c, step+1});
			}
			if (!f[a][0]) {
				f[a][0] = true;
				q.push({a, 0, c + b, step + 1});
			}
		}
		if (c) {
			if (c + a >= n && !f[n][b]) {
				f[n][b] = true;
				q.push({n, b, c+a-n, step+1});
			}
			else if (c + a < n && !f[c+a][b]) {
				f[c+a][b] = true;
				q.push({c+a, b, 0, step+1});
			}
			if (c + b >= m && !f[a][m]) {
				f[a][m] = true;
				q.push({a, m, c+b-m, step+1});
			}
			else if (c + b < m && !f[a][c+b]) {
				f[a][c+b] = true;
				q.push({a, c+b, 0, step+1});
			}
		}
	}
	cout << ans << endl << cnt << endl;
	return 0;
}

修改回文(二)

题目:给定一个仅由小写字母组成的字符串 s ,你可以添加一些字符(也可以不加),使其构成回文串。请你输出在添加字符数最少的前提下,能够构成字典序最小的回文串。

分析:\(1e^{3}\)范围想\(n^{2}\),添加字符数最少的回文,就可以用区间dp的思路,只看最外围的情况,比如从l 到 r的区间 如果第l个字符和第r个字符一样,那数量就和从l+1到r-1的数量一样,如果不是就是看从l到r-1和从l+1到r范围内哪个少就是哪个,如果都一样那哪个对于数量来说都一样,但要求构成字典序最小,然后需要比第l个字符和第r个字符的ascll码,哪个小加哪个,所以通过分析知道我们要预处理长度为1和长度为2的字符串,然后dp刷,如果直接维护答案,那么时间复杂度是 \(n^{3}\) 就tle了,所以我们先维护字符串数最少是多少,然后在这个条件下去回溯找到这个最小的回文串是什么。

代码:

#include<bits/stdc++.h>
using namespace std;
string str;
int dp[1010][1010]; //dp[i][j]表示从str[i]到str[j]通过添加字符数构成回文串的字符串最少数量
string sol(int l, int r) {
	if (l == r) return str.substr(l, 1);
	if (l + 1 == r) {
		if (dp[l][r] == 0) return str.substr(l, 2);
		if (str[l] < str[r]) return str.substr(l, 2) + str[l];
		return str[r] + str.substr(l, 2);
	}
	if (str[l] == str[r]) {
		return str[l] + sol(l + 1, r - 1) + str[r];
	}
	if (dp[l + 1][r] < dp[l][r - 1]) {
		return str[l] + sol(l + 1, r) + str[l];
	}
	if (dp[l + 1][r] > dp[l][r - 1]) {
		return str[r] + sol(l, r - 1) + str[r];
	}
	if (str[l] < str[r]) {
		return str[l] + sol(l + 1, r) + str[l];
	}
	return str[r] + sol(l, r - 1) + str[r];
}
int main(){
	cin >> str;
	int n = str.size();
	str = '0' + str;
	for (int i = 1; i <= n; i++) {
		dp[i][i] = 0;
	}
	for (int l = 1; l + 1 <= n; l++) {
		if (str[l] != str[l + 1]) 
			dp[l][l + 1] = 1;
	}
	for (int i = 3; i <= n; i++) {
		for (int l = 1; l + i - 1 <= n; l++) {
			int r = l + i - 1;
			if (str[l] == str[r])
				dp[l][r] = dp[l+1][r-1];
			else {
				dp[l][r] = min(dp[l+1][r], dp[l][r-1]) + 1;
			}
		}
	}
	cout << sol(1, n) << endl;
	return 0;
}

标签:月赛,return,int,乙组,long,2024,step,str,push
From: https://www.cnblogs.com/forleaves/p/18362328

相关文章

  • 【2024-08-15】中青年了
    20:00在生气时,自己照照镜子,这会给你很大的帮助,它将成为敲醒你的正念之钟。                                                 ——一行禅师在上周处理外婆的后事时,跟香......
  • 华为OD笔试机试 - 攀登者2 (python/c++/java 2024年C卷D卷真题算法)
    华为OD机试(C卷+D卷)2024真题目录(Java&c++&python)题目描述攀登者喜欢寻找各种地图,并且尝试攀登到最高的山峰。地图表示为一维数组,数组的索引代表水平位置,数组的元素代表相对海拔高度。其中数组元素0代表地面。例如:[0,1,2,4,3,1,0,0,1,2,3,1,2,1,0],代表如下图所示的......
  • 题解:P10313 [SHUPC 2024] 占地斗士!
    题目大意给出一个由.和#组成的\(n\timesm\)矩阵,然后再给你这\(4\)种图像,用着四种图像对矩阵进行覆盖(每个只能用一次)。其中,#的位置不可以被图像遮挡,也不能放在不能放置的格子上。解题思路考虑使用爆搜。第一个图像:if(mp[i][j]!='#'&&mp[i+1][j+1]!='#'......
  • 2024.8.15随笔
    上午今天自习!写题写爽了!本来说复习顺序为PAM、后缀相关,但是hfu今天在早读完后给我们聊了一些学习的方法、给我们提供了一些学习思路。在思考了一会后,我还是决定不任性去重拾九级难度以上的后缀数组(自动机),而是回过头去复习图论。写了三道紫色的二分图,写爽了!二分图我已经很熟悉......
  • 2024.8.15
    2024.8.15【这雨生于天,死于地,中间的过程就是人生。】Thursday七月十二动态DP(DDP)我们选择从一道模板题讲起[P4719【模板】"动态DP"&动态树分治](P4719[模板]"动态DP"&动态树分治-洛谷|计算机科学教育新生态(luogu.com.cn))【模板】"动态DP"&动态树分治题目描......
  • Kali 2024 逆向调试 GDB 13.2 安装插件 Peda 不兼容报错解决方案
    发现问题如果你尝试直接进行$aptinstallgdb安装后应该是最新版的gdb13.2。并且尝试安装peda后将会出现fromsix.movesimportrange报错2024版的kali的python3是python3.11版本,而peda中的six库支持的是3.11之前的。而gdb13是支持python3.12的。有趣的一点是,当我们......
  • 高级java每日一道面试题-2024年8月15日-设计模式篇-设计模式与面向对象原则的关系是什
    如果有遗漏,评论区告诉我进行补充面试官:设计模式与面向对象原则的关系是什么?我回答:在设计模式与面向对象原则的关系中,两者紧密相连且相互促进。面向对象的原则为设计模式的形成提供了理论基础和指导思想,而设计模式则是这些原则在特定问题域中的具体实践和实现方式。下......
  • 2024暑假集训测试25
    前言比赛链接。一上来就感觉T4最可做,发现T4题面假了,去找学长改了,让后第一反应二分哈希,怎么调大样例都过不去,异常上火,狂调一个半小时才想起来丫的这玩意儿没有单调性,然后就崩了。结果T4string用死了挂成\(0\)分了还。T2是水板子但是不会那个板子,心态者了T1也没搞......
  • 2024年8月杂题
    P3226[HNOI2012]集合选数很巧妙,原问题不好做,转化成矩阵上选择不相邻数字的方案,变成了我们熟悉的问题。[ARC068F]Solitaire难。题目的条件告诉我们最后队列里呈现“V”字形。如何计算删数的方案??找到合法方案的约束条件,用DP去计数,构造过程,都很难。[ARC068E]SnukeLine胡......
  • 20240815有名管道双端线程通信
    //端1#include<stdio.h>#include<stdlib.h>#include<sys/types.h>#include<sys/stat.h>#include<fcntl.h>#include<unistd.h>#include<string.h>#include<pthread.h>#include<errno.h>#include<......