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

news2024/11/25 14:33:44

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

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

M Best Carry Player

题意:给你n(1 \leq n \leq 10^5)个数,交换他们的顺序使依次相加后总的进位次数最少(十进制),并输出进位次数。(1 \leq a_i \leq10^9)

很显然,加法中两数相加最多进位进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(1 \leq T \leq 10^5)组数据,每次给定一个n和k(1 \leq k \leq n \leq 10^9),问是否存在一个n的排列,满足所有长度为k的子区间内的数的和的奇偶性相同。

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

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

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

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

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

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

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

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

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

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

所以我们可以得出当n \in[tk, (t+1)k]时,只有n \in [tk+t-1,tk+x+x-(t-1)]时构造有解。

举个例子: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

题意:

(bushi)

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

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

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

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

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

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

上代码了

#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;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/1176159.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

代码随想录打卡第62天|● 503.下一个更大元素II ● 42. 接雨水

● 503.下一个更大元素II 题目&#xff1a;给定一个循环数组 nums &#xff08; nums[nums.length - 1] 的下一个元素是 nums[0] &#xff09;&#xff0c;返回 nums 中每个元素的 下一个更大元素 。 数字 x 的 下一个更大的元素 是按数组遍历顺序&#xff0c;这个数字之后的第…

蓝桥杯每日一题2023.11.6

取位数 - 蓝桥云课 (lanqiao.cn) 题目描述 题目分析 由题意我们知道len中为现阶段长度&#xff0c;如果其与k相等也就是找到了正确的位数&#xff0c;否则就调用递归来进行搜索&#xff0c;每次搜索一位数。 #include <stdio.h> // 求x用10进制表示时的数位长度 int …

你的停机真的优雅么?第二弹来袭 | 京东云技术团队

1. 前言 之前总结了一篇基于现有业务线在停机重启时会产生RPC和MQ调用强杀导致业务数据不一致文章&#xff0c;文中通过优雅停机改造对RPC服务进行反注册和MQ进行暂停消费&#xff0c;进而可以解决在停机时强制kill掉RPC线程或者MQ线程导致数据不一致现象&#xff0c;具体的原…

DolphinDB 流计算优化实践:时延统计与性能调优

在实时计算中&#xff0c;端到端的响应延迟是衡量计算性能时最重要的指标。DolphinDB 内置的流数据框架支持流数据的发布与订阅、流式增量计算、实时关联等&#xff0c;用户能够快速实现复杂的实时计算任务&#xff0c;达到毫秒级甚至亚毫秒级的效果&#xff0c;而无需编写大量…

这8个Wireshark使用技巧,网工屡试屡爽!

你们好&#xff0c;我的网工朋友。 都懂哈&#xff0c;wireshark是个啥我就不多赘述了&#xff0c;软件功能十分强大就对了。 想安装的可以戳这里&#xff1a;《wireshark下载&安装 》 wireshark作为网工的得力助手&#xff0c;你知道哪些使用技巧&#xff1f; 今天就给…

2023软考-系统架构师一日游

上周六&#xff08;11月4号&#xff09;参见了软考&#xff0c;报的系统架构师&#xff0c;今年下半年是第一次推行机考&#xff0c;简单来分享下大致流程&#xff0c;至于考试难度、考点什么的&#xff0c;这个网上有很多专门研究这些的机构&#xff0c;本人无权发言。考试的经…

每日一题 318. 最大单词长度乘积(中等)

暴力求解没超时&#xff0c;那就这样吧 class Solution:def maxProduct(self, words: List[str]) -> int:ans 0for i in range(len(words)):for j in range(i 1, len(words)):if len(words[i]) * len(words[j]) < ans:continuet 0for k in range(26):ch chr(k ord(…

XCTF-Crypto1

Caesar 题目描述 oknqdbqmoq{kag_tmhq_xqmdzqp_omqemd_qzodkbfuaz} 分析解密 根据题目Caesar推测是凯撒加密 当偏移量为12时&#xff0c;成功得到flag&#xff1a;cyberpeace{you_have_learned_caesar_encryption} Morse 题目描述 11 111 010 000 0 1010 111 100 0 00 000 …

外汇天眼:不要等到被骗才追悔莫及,远离以下被吊销牌照的平台!

监管信息早知道&#xff01;外汇天眼将每周定期公布监管牌照状态发生变化的交易商&#xff0c;以供投资者参考&#xff0c;规避投资风险。如果平台天眼评分过高&#xff0c;建议投资者谨慎选择&#xff0c;因为在外汇天眼评分高不代表平台没问题&#xff01; 以下是监管牌照发生…

FAT32转换成NTFS免费软件Tuxera NTFS2024

很多人在使用电脑时都没有注意过系统中的磁盘是哪种格式。一般目前常用的磁盘格式分为FAT32和NTFS两种。那么它们哪种更适合我们以及如何将磁盘格式转换成该格式呢&#xff1f; Tuxera NTFS2023最新免费版下载如下&#xff1a; https://wm.makeding.com/iclk/?zoneid58824 实…

NTP8918(2x15W双通道立体声内置DSP数字功放)

NTP8918是一款高性能、高保真功率驱动集成全数字音频放大器&#xff1b;内置DSP采用I2S输出&#xff1b;可提供2x15W的输出&#xff08;BTL模式&#xff09;或者30W的单通道输出&#xff08;PBTL模式&#xff09;具备可靠性高、功率足、音色出众、适应能力强等优势。 该芯片工…

【TES745D】青翼自研基于复旦微的FMQL45T900全国产化ARM核心模块(100%国产化)

板卡概述 TES745D是一款基于上海复旦微电子FMQL45T900的全国产化ARM核心板。该核心板将复旦微的FMQL45T900&#xff08;与XILINX的XC7Z045-2FFG900I兼容&#xff09;的最小系统集成在了一个87*117mm的核心板上&#xff0c;可以作为一个核心模块&#xff0c;进行功能性扩展&…

docker安装(超详细)

一.引言 本安装教程参考Docker官方文档&#xff0c;地址如下&#xff1a;https://docs.docker.com/engine/install/centos/ 二.卸载旧版docker(第一次安装可忽略) 首先如果系统中已经存在旧的Docker&#xff0c;则先卸载&#xff1a; yum remove docker \docker-client \docker…

Excel【毫秒】/【秒】转换成【时分秒】/【分秒】

1、毫秒转换秒 2、秒转换时分秒 3、秒转换分秒

导轨式安装压力应变桥信号处理差分信号输入转换变送器0-10mV/0-20mV/0-±10mV/0-±20mV转0-5V/0-10V/4-20mA

主要特性 DIN11 IPO 压力应变桥信号处理系列隔离放大器是一种将差分输入信号隔离放大、转换成按比例输出的直流信号导轨安装变送模块。产品广泛应用在电力、远程监控、仪器仪表、医疗设备、工业自控等行业。此系列模块内部嵌入了一个高效微功率的电源&#xff0c;向输入端和输…

mac卸载软件工具CleanMyMac X4.15永久版下载

如今电脑成为大多数人工作的工具&#xff0c;使用得越久就越需要清理垃圾软件。系统垃圾、废纸娄垃圾、大型和旧文件这些通常都占用了我们的电脑几G的空间。 想要清除不必要的垃圾文件&#xff0c;可以使用mac卸载软件CleanMyMac X&#xff0c;这款清理垃圾软件可以智能扫描Ma…

基于DevEco Studio的OpenHarmony应用原子化服务(元服务)入门教程

一、创建项目 二、创建卡片 三、应用服务代码 Index.ets Entry Component struct Index {State TITLE: string OpenHarmony;State CONTEXT: string 创新召见未来&#xff01;;build() {Row() {Column() {Text(this.TITLE).fontSize(30).fontColor(0xFEFEFE).fontWeight(…

灵活多变的保护——OV通配符证书

随着互联网发展&#xff0c;网站安全性日益关乎企业和个人的信誉与用户体验。而在诸多SSL证书中&#xff0c;OV通配符证书以其灵活多变的特点成为了一个备受推崇的选择。本文将介绍什么是OV通配符证书以及其在网站保护方面的优势。 OV通配符证书是一种提供全面SSL加密保护的数…

2023-11-06 LeetCode每日一题(最大单词长度乘积)

2023-11-06每日一题 一、题目编号 318. 最大单词长度乘积二、题目链接 点击跳转到题目位置 三、题目描述 给你一个字符串数组 words &#xff0c;找出并返回 length(words[i]) * length(words[j]) 的最大值&#xff0c;并且这两个单词不含有公共字母。如果不存在这样的两个…

每天一个公众号干货|定时群发教程

每天一个公众号排版小知识&#xff0c;今天分享的是定时群发功能&#xff0c;一次性给你讲清楚 公众号定时群发可以让我们在固定的时间精准的发表文章&#xff0c;这对发文强迫症的小伙伴来时是一个非常神仙的功能&#xff0c;如果群发之前有事耽误发表了&#xff0c;也可以使…