2022ICPC,济南站(M,E,D

这篇具有很好参考价值的文章主要介绍了2022ICPC,济南站(M,E,D。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

初见安~好久好久没写博客了……感觉还是有必要写的。

拿去年济南的题目训练了一下,状态还不错,写一下自己写过了的题目的题解。

M Best Carry Player

题意:给你n个数,交换他们的顺序使依次相加后总的进位次数最少(十进制),并输出进位次数。

很显然,加法中两数相加最多进位进1;单看每一位就能发现,其实进位次数跟顺序压根没关系

所以写一个高精加法模拟加法过程算进位次数就完了。

注意数据范围,最多可以达到14位数。

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1, ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
	return x * f;
}

int T, n;
int res[100];
char s[100];
signed main() {
	T = read();
	while(T--) {
		memset(res, 0, sizeof res);
		n = read(); int ans = 0;
		for(int i = 1; i <= n; i++) {
			scanf("%s", s + 1); int len = strlen(s + 1), p = 1;
			for(int j = len; j; j--, p++) {
				res[p] += s[j] - '0';
				if(res[p] > 9) res[p] -= 10, ans++, res[p + 1]++;
			}
			
			for(; p <= 15; p++) if(res[p] > 9) res[p] -= 10, ans++, res[p + 1]++;//
		}
		printf("%d\n", ans);
	}
	return 0;
}
/*
2
3
9 99 999
1
12345
*/

E Identical Parity

题意:T组数据,每次给定一个n和k,问是否存在一个n的排列,满足所有长度为k的子区间内的数的和的奇偶性相同。

显然我们只需要考虑这长度为n的排列中每个数的奇偶个数能否满足。

有一些特殊情况容易想到:

  • k=1时,除非n=1,否则都无法满足题意;
  • k为偶数时,一定可以满足题意(奇偶交错的排列均可);
  • k为奇数(k != 1)时,我们需要额外进行讨论了。

因为若长度为n的排列是满足奇偶性的条件,那么任意长度为l的区间都满足区间奇偶性的条件。(不一定满足为一个合法排列,即奇数个数=偶数个数(+1)的条件)所以我们首要考虑奇偶性的条件如何满足。

首先考虑第一个长度为k的区间,k是奇数,故一定是奇数个数大于偶数个数(否则凑不了多少长度),不妨令x+1为奇数个数,则x为偶数个数。(2x+1=k)

令此时的构造排列为,其中xi为0或者1表示为偶数or奇数。

假设我们已经构造好了,对于下一个区间2022ICPC,济南站(M,E,D,XCPC,算法,ICPC,相当于在前一个区间的基础上减去x1加上x_{k+1},且sum的奇偶性不变。换言之,2022ICPC,济南站(M,E,D,XCPC,算法,ICPC奇偶性相同。也就是说:对于任意长度的排列,我们构造好了前k个的奇偶性后,之后每一位的奇偶性都是确定的。也可以说:每个区间内奇数和偶数个数都是一样的

所以我们只需要考虑如何对这x+1个奇数和x个偶数如何进行排序。

易知n=2k时,即奇数比偶数多两个,一定无法构造出来;推出n=tk时,奇数会比偶数多t个。所以要满足题意,我们需要在后面补至少t-1个偶数。也就是说此时构造的x序列,至少前t-1个可以是偶数。即:。

同理,假如我们补完所有0后继续往后面补1,至多可以补多少个1呢?那就是个,也就是多了多少个0就可以补多少个1。

所以我们可以得出当2022ICPC,济南站(M,E,D,XCPC,算法,ICPC时,只有2022ICPC,济南站(M,E,D,XCPC,算法,ICPC时构造有解。

举个例子:k=3时,我们容易想到n=3,4,5都构造有解。而n=7就是最大的一个满足情况的n。

我们只能构造奇偶序列如:011 011 0,把0放在最前面,这样会优先把0复制在最后。

再比如k=5时,我们可以构造前5个为00111,这样可以满足n=11~13,17的情况。

代码就是公式抄一遍。

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1, ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
	return x * f;
}

int T, n, k;
signed main() {
	T = read();
	while(T--) {
		n = read(), k = read();
		if(k == 1) {
			if(n == 1) puts("Yes");
			else puts("No");
		}
		else if(k % 2 == 0) puts("Yes");
		else {
			int t = n / k, x = k / 2;
			if(t * k + t - 1 <= n && n <= t * k + 2 * x - t + 1) puts("Yes");
			else puts("No");
		}
	}
	return 0;
}
 

D Frozen Scoreboard

题意:2022ICPC,济南站(M,E,D,XCPC,算法,ICPC

(bushi)

n个题目m个队伍,你有一个封榜前的榜单,已知每个队伍(相互独立)每个题目的状态和最终通过提数和罚时,问你是否存在一个终榜满足这些条件并构造出来。(具体的看原题目吧)

说白了就是模拟……没通过和没提交的题目没有任何作用,原样输出就好;+的题目要记得加上wa的罚时,剩下的就是?的题目看要选哪些通过。

n很小啊只有13,那就最多13个?。我们把?全取出来,需要通过的题目数是已知的,最坏情况是,m又只有1e3,所以暴力枚举。枚举完了过后考虑如何分配剩余的罚时。

首先每个题目240罚时起步;其次20,20地尽量把赛后的未通过提交的罚时用完,最后再用每个题剩的59min去凑零碎的剩余罚时。

思路很简单但是实现起来挺恶心的……要存的东西很多。

以及对于No的判定,要提前把 ?不够多;罚时不够减;罚时凑不上等一看就凑不出来的情况判掉。

上代码了文章来源地址https://www.toymoban.com/news/detail-745660.html

#include<algorithm>
#include<iostream>
#include<iomanip>
#include<cstring>
#include<cstdio>
#include<vector>
#include<cmath>
#include<queue>
#include<map>
using namespace std;
typedef long long ll;
int read() {
	int x = 0, f = 1, ch = getchar();
	while(!isdigit(ch)) {if(ch == '-') f = -1; ch = getchar();}
	while(isdigit(ch)) x = (x << 1) + (x << 3) + ch - '0', ch = getchar();
	return x * f;
}

int n, m;
int num, T; 
struct node {
	char x;
	int cnt, tm;
}st[20];

struct TSK {
	int cnt, tm;
	int out_cnt, out_tm;
	bool in;
}tsk[20];

int tot = 0;
bool flag;
int ch[20];
void out() {
	puts("Yes");
	int now = 1;
	for(int i = 1; i <= m; i++) {
		if(st[i].x == '.') puts(".");
		else if(st[i].x == '-') printf("- %d\n", st[i].cnt);
		else if(st[i].x == '+') printf("+ %d/%d\n", st[i].cnt, st[i].tm);
		else {
			if(tsk[now].in) printf("+ %d/%d\n", tsk[now].out_cnt, tsk[now].out_tm);
			else printf("- %d\n", tsk[now].cnt);
			now++;
		}
	}
}

void dfs(int p, int lst) {
	if(flag) return;
	if(p > tot && lst <= num) return;
	if(lst > num) {//通过数凑到了
		int Tm = T - 240 * num;//每个题至少240罚时
		for(int i = 1; i <= num; i++) {
			tsk[ch[i]].out_tm = 240, Tm -= (tsk[ch[i]].cnt - tsk[ch[i]].tm) * 20;
			tsk[ch[i]].out_cnt = tsk[ch[i]].cnt - tsk[ch[i]].tm + 1;
			if(tsk[ch[i]].out_cnt > tsk[ch[i]].cnt) return;
		}
		if(Tm < 0) return;//必扣罚时扣了发现时间不够

		for(int i = 1; i <= num && Tm > 20; i++) {
			register int cnt1 = tsk[ch[i]].cnt, cnt2 = tsk[ch[i]].out_cnt;
			if(Tm > (tsk[ch[i]].tm - 1) * 20) Tm -= (tsk[ch[i]].tm - 1) * 20, tsk[ch[i]].out_cnt = tsk[ch[i]].cnt;
			else {
				int tmp = Tm / 20;
				Tm -= tmp * 20;
				tsk[ch[i]].out_cnt += tmp;
			}
		}
		for(int i = 1; i <= num && Tm > 0; i++) {
			if(Tm > 59) Tm -= 59, tsk[ch[i]].out_tm = 299;
			else if(Tm > 0) tsk[ch[i]].out_tm += Tm, Tm = 0;
		}
		
		if(!Tm) {flag = true; out();}
		return;
	}
	dfs(p + 1, lst);
	if(flag) return;
	tsk[p].in = true; ch[lst] = p; dfs(p + 1, lst + 1); tsk[p].in = false;
}

signed main() {
//	freopen("out.txt", "w", stdout);
	n = read(), m = read();
	while(n--) {
		num = read(), T = read();
		tot = 0; int sum = 0;
		flag = false;
		for(int i = 1; i <= m; i++) {
			cin >> st[i].x;
			if(st[i].x == '.') continue;
			else if(st[i].x == '-') st[i].cnt = read();
			else if(st[i].x == '+') {
				int t1 = read(), t2 = read();
				st[i].cnt = t1, st[i].tm = t2;
				T -= (t2 + t1 * 20 - 20);
				num--;
			} else {
				st[i].tm = tsk[++tot].tm = read(),//tm: after frozen
				st[i].cnt = tsk[tot].cnt = read();//cnt: all of
				tsk[tot].in = false;
				sum += st[i].cnt - 1;//sum:至多凑出来的罚时次数(其实作用不大
			}
		}
		
		if(num < 0 || T < 0 || tot < num || num * 240 > T || num * 299 + sum * 20 < T) 
			{puts("No"); continue;}
			
		dfs(1, 1);
		if(!flag) puts("No");
	}
	return 0;
}

到了这里,关于2022ICPC,济南站(M,E,D的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 训练记录番外篇(2):2022 ICPC Gran Premio de Mexico 2da Fecha

    2022.10.3 之前训得ak场,个人认为很edu。 (顺便一提,可能这个训练记录番外系列的比赛都非常edu,十分建议铜银选手单挑) 题意比较晦涩难懂,但是读完发现是个toposort。 发现能够成为答案的点非常少,爆搜出所有可以成为答案的点然后直接二分即可。 小模拟题,锻炼码力

    2023年04月08日
    浏览(30)
  • 算法竞赛ICPC、CCPC、NIO、蓝桥杯、天梯赛

    🎁🎁🎁 本文章将进行超链接,建议大家收藏,在接下来的一年时间,本文章基本可以完成更新,请大家耐心等待 ~~ ⭐️ 本博客深入解析与算法竞赛相关的数据结构、算法、代码。包括基础数据结构、基本算法、搜索、高级数据结构、动态规划、数论和线性代数、组合数学

    2024年02月11日
    浏览(79)
  • GXU_XCPC_Board rating 计算规则

    B a s e R a t i n g = P r o b l e m S c o r c e ∗ 0.5 + r a t i n g S c o r c e ∗ 0.4 + B l o g S c o r e ∗ 0.1 BaseRating =ProblemScorce*0.5+ratingScorce*0.4+BlogScore*0.1 B a se R a t in g = P ro b l e m S corce ∗ 0.5 + r a t in g S corce ∗ 0.4 + Bl o g S core ∗ 0.1 P r o b l e m S c o r c e = P a s s P l o b l e m S u m ProblemScorce = PassPlo

    2023年04月14日
    浏览(24)
  • 2020ICPC南京站

    K Co-prime Permutation 题意:给定n和k,让你构造n的排列,满足gcd(pi, i)=1的个数为k。 思路:因为x和x-1互质,1和任何数互质,任何数和它本身不互质 当k为奇数时,p1=1,后面k-1个数两两互换 当k为偶数时,后面k个数两两互换 Let\\\'s Play Curling 题意:给定n块红色石头,m块蓝色石头的位

    2024年02月10日
    浏览(29)
  • 2023ICPC西安邀请赛

    更好的阅读体验:传送门 比赛完由于被旅游、赶ddl、上班等等各种事情影响,导致我现在才有时间可以写写小作文,这中间隔得时间有点长了,已经不知道从哪开始说起了,灵感也都流失了… 比赛前一个周,我的队友djk,也是我的舍友,周一从合肥回来,嗓子的声音严重变

    2024年02月05日
    浏览(31)
  • sakuya726's 2023 ICPC China SiChuan Provincial Programming Contest(ICPC2023四川省赛)游记随笔

    出发前一天,收拾东西做好准备工作。打印了自己记忆中所有高级数据结构的板子(然而实际上并没有卵用),VP一把往年的四川省赛。 不出意外的失眠了,早上九点四十的火车,凌晨五点才睡觉。七点半出发去火车站,天还下着雨,刚开始感觉还挺有意境,然后当我在雨中

    2024年02月07日
    浏览(51)
  • 2020ICPC南京【个人题解EFHKLM】

    首先如果炸弹在(0,0)或者机器人最终停在炸弹处,那么一定Impossible。 对于其他的情况,如果存在一条路径使得机器人可以不经过炸弹,那么一定存在一种方案,使得相同的方向在这个方案种是连在一起的。 于是可以直接枚举所有方向的排列,共4!个,判断每一种排列能否绕过

    2023年04月09日
    浏览(40)
  • XTU-OJ 1170-ICPC

    题目描述 ACM/ICPC比赛涉及的知识点非常多,一个队伍三个人需要能够互补。一个队伍某个知识点的高度是三个人中水平最高的那个人决定。现在给你三个人的每个知识点的水平情况,请计算一下这个队伍的水平。 输入 存在多个样例。每个样例的第一行是一个整数N(3≤N≤100

    2024年02月08日
    浏览(31)
  • 济南企业专利申请的流程和费用

    1.申请准备阶段: -确定发明或创新的对象和目标。 -进行专利检索,查找已有的相关专利。 -准备申请材料,包括专利申请书、技术描述、权利要求、说明书和图纸等。 2.申请提交阶段: -将申请材料提交给专利局,如国家知识产权局。 -缴纳申请费用,并获得收据。 3.审查和

    2024年02月16日
    浏览(26)
  • 济南大学 《计算机网络2a》期末考点

    Part 2  交换 交换机的学习和转发方法 学习:源地址构建MAC地址表 转发:包括两种方法——存储转发交换、直通交换 注意:交换机永远不会把流量从它接收到的接口转发出去 冲突域广播域 交换机和路由器划分冲突域 路由器划分广播域 Part 3  VLAN 基本知识点 默认所有端口属

    2024年01月17日
    浏览(46)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包