参加2022 年第四届齐鲁工业大学(山东省科学院)与山东师范大学ICPC 大学生程序设计竞赛的总结

Problem A. 下一个

在漫长且无聊的出题过程中,jc 一直苦于怎么出几道毒瘤题恶心一下参赛选手,甚至想到他的 cpu 都快 爆炸了。最终,jc 还是决定大发慈悲,出一道《简单》题。

jc 会扔给你一个神奇的字符,这个字符可能是小写字母,也有可能是大写字母,请你输出这个字符在字 母表中的下一个字符,例如,a 的下一个是 b,A 的下一个是 B。当然了,输出字符的大小写形式需要和 这个字符一致。

如果不存在下一个字符,请输出“non-existent”(不包含引号)。

Input

一个大写字母或一个小写字母。

Output

输出一个字符或“non-existent”(不包含引号)。

签到题,没啥好说的 


Problem C. 勇者之塔

2100 年,地球不可再生资源面临枯竭,环境污染问题已严重威胁到人类生活。为了寻找更优的生存环境, 为了探索更佳能源物资,科学家们开始了赛尔机器人的研究工作。这是一个集合了全世界所有优秀科学 家的科研组,联合国给他们提供了最好的研究环境、最丰富的环境资源。在全世界无数双眼睛的关注下, 历经半个世纪“赛尔”终于诞生了,带来了希望和梦想的翅膀。人们将那一年(2170 年)改元为赛尔元 年,以此提醒所有的人,宇宙探索任重而道远。

Leonard 对赛尔号这款游戏如痴如醉。今天,他梦见自己进入了赛尔号的勇者之塔。

由于是梦境的缘故,这里的勇者之塔与现实世界中赛尔号的勇者之塔大不相同。

这个勇者之塔的层数是无尽的,每一层都是一个 n 行 m 列的矩阵。每一个任务的起点都是第一层的 (1, 1), 并且每一步只能走相同的行和相同的列且只能朝向坐标更大的方向,当某一步走出这个矩阵时,就会前 往下一层的 (1, 1),然后继续执行下一步。例如,在一次任务中给定 x = 2,y = 3,当前位置为 (1, 1), 那 么走一步会到达 (1 + x, 1 + y) = (3, 4),如果 (3, 4) 在矩阵之外,就会立即到达下一层的 (1, 1)。 罗杰船长给 Leonard 发布了 q 个任务,每个任务给定 x,y,k,想让 Leonard 求出按以上规则走 k 步会 到达第几层的哪一个点。

笨笨的 Leonard 并不知道,但他还想继续玩下去,聪明的你能帮助他吗?

Input

第一行两个数字 n,m,是这个矩阵的行数和列数。

第二行一个数字 q,是任务的个数。

接下来 q 行,每行三个数字 x,y,k,表示在这个任务中的每一步走的距离和走的次数。

1 ≤ n, m ≤ 109 , 1 ≤ q ≤ 105 , 0 ≤ x, y, k ≤ 109。

Output

输出 q 行,每行三个数字,表示最终位置位于第几层,第几行,第几列。

思路 

这个题的难度主要在优化上,因为每次走向下一层会将位置初始为1,1。

所以只要计算走出一层需要多少步,就可以算出层数,这样就可以只用一层for循环来解决这个问题

下面是ac代码 


#include<bits/stdc++.h>
using namespace std;
struct op{
	int x;
	int y;
	int bushu;
}s[100001];
struct ok{
	int cengshu;
	int x1;
	int y1;
}t[100001];
int main(){
	int m;
	int n;
	scanf("%d %d",&m,&n);
	int q;
	scanf("%d",&q);
	for(int i=0;i<q;i++){
		scanf("%d %d %d",&s[i].x,&s[i].y,&s[i].bushu);
	}
	for(int i=0;i<q;i++){
		int ans=0;
		int ant=0;
		int ci=0;
		if(s[i].x!=0){
			ans=m/s[i].x+1;
			if(m%s[i].x==0)
				ans--;
		}//计算横着走出一层的步数
		if(s[i].y!=0){
			ant=n/s[i].y+1;
			if(n%s[i].y==0)
				ant--;
		}//竖着的
		ci=min(ans,ant);
		if(s[i].x==0&&s[i].y!=0){
			ci=max(ans,ant);
		}
		else if(s[i].y==0&&s[i].x!=0)
			ci=max(ans,ant);
//求出走完一层需要的步数
		int x2=1,y2=1;
		int ceng;
		int cishu;
		if(ci==0){
			cishu=0;
			ceng=1;
		}
		else{
			cishu=s[i].bushu%ci;
			ceng=(s[i].bushu/ci)+1;
		} 
		for(int j=0;j<cishu;j++){
			x2+=s[i].x;
			y2+=s[i].y;
		}
		t[i].cengshu=ceng;
		t[i].x1=x2;
		t[i].y1=y2;
	}
	for(int i=0;i<q;i++){
		printf("%d %d %d\n",t[i].cengshu,t[i].x1,t[i].y1);
	}
	return 0;
}

​

 

Problem G. 简单的数学

输入n,计算下面这个式子的结果

 

 第一眼看到被这题唬住了,但仔细一想只让输入一个n

再看榜上的做出这题的很多,原来也是个签到题

直接上代码

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	int m;
	m=n%1000000007;
	cout<<m<<endl;
	return 0;
}


Problem L. 奥特曼的时间管理

在距离银河系遥远的 M78 星云,奥特曼们建造了他们的家园——光之国。虽然奥特曼们具有无尽的生命, 对于正常人来说漫长的时间对于他们来说只是弹指一挥间。但为了让每个奥特曼尽可能地参悟生命的意 义,奥特议会决定学习人类们记录时间的方式来让每个奥特曼们首先感受到时间的流逝,他们把时间用 时分秒的方式划分出来。 但因为 M78 星云特有的环境与引力环境,导致光之国的自转时间也与地球的自转时间不同。为了应对不 同的情况,奥特议会设立 1 分钟有 z 秒钟,1 小时有 y 分钟,1 天有 x 小时。 奥特能源中心是光之国十分重要的部门之一,他负责给所有奥特曼提供所需的能源。因为每个奥特曼的 能力不同与职位不同,他们充取能源的持续时间和开始时间都可能不同。负责给奥特曼提供能源的是一 个巨大的能源仓,它可以同时支持多位奥特曼充取能源。因为能源所蕴含的能量过于丰沛,所以无论给多 少(至少一位)奥特曼提供能源,每秒消耗能源量都不变。当一名奥特曼充取能源完成后 k 秒以后如果 没有奥特曼再次充取能源,则能源仓停止提供能源,在这 k 秒中,即使没有奥特曼充取能源,能源仓依 旧提供能源。 为了支持奥特议会宣布的时间计划,奥特能源中心决定统计每天 (00 : 00 : 00) − (x − 1 : y − 1 : z − 1) 统 计消耗多少能源,现给你 n 位奥特曼的充取能量情况与每秒钟消耗能源量。请你输出当天能源消耗量。

Input

第一行输入六个整数 n, x, y, z, k, val , n 代表当天充取能量的奥特曼的数量, x 代表一天有 x 小时, y 代 表一小时有 y 分钟, z 代表一分钟有 z 秒钟, k 代表 k 秒钟后停止提供能源, val 代表每秒提供能源数。 (1 ≤ n ≤ 106 , 10 ≤ x, y, z ≤ 99, 1 ≤ k ≤ 102 , 1 ≤ val ≤ 106 ) 接下来 n 行 每行两个字符串 sa, sb, sa 代表第 i 位奥特曼充取能源的开始时间, bi 代表第 i 位奥特曼充取能源的结束 时间。注意:充取能源的开始时间和结束时间奥特曼都在充取能源(左右闭区间)。 为了便于读入,每个数字都采取了补零至两位的方式,且冒号均为英文符号。 保证每位奥特曼充取能源的开始时间不晚于结束时间。 不保证每位奥特曼充取能源的时间范围没有交集。

Output

输出共一行 输出当天能源消耗量

 思路

将时间都转换为秒,然后多个输入的时间区间进行合并

另外还需注意超出一天的范围要减去

放上代码

#include<bits/stdc++.h>
using namespace std;
struct op{
	long long kaishi;
	long long jieshu;
}t[1000006];
struct ok{
	long long k1;
	long long k2;
}u[1000006];
bool cmp(op a,op b){
	if(a.kaishi!=b.kaishi)
		return a.kaishi<b.kaishi;
	else
		return a.jieshu<b.jieshu;
}
int main(){
	int n, x, y, z, k, val;
	string sa,sb;
	cin>>n>>x>>y>>z>>k>>val;
	long long tian=x*y*z-1;
	for(int i=0;i<n;i++){
		cin>>sa>>sb;
		t[i].kaishi=((sa[0]-'0')*10+sa[1]-'0')*y*z+((sa[3]-'0')*10+sa[4]-'0')*z+(sa[6]-'0')*10+sa[7]-'0';
		t[i].jieshu=((sb[0]-'0')*10+sb[1]-'0')*y*z+((sb[3]-'0')*10+sb[4]-'0')*z+(sb[6]-'0')*10+sb[7]-'0'+k;
		if(t[i].jieshu>tian){
			t[i].jieshu=tian;
		}
	}
	sort(t,t+n,cmp);
	int ant=0;
	int ans=0;
	for(int i=1;i<n;i++){
		if(t[i].kaishi<=t[i-1].jieshu){
			t[i].kaishi=t[i-1].kaishi;
			t[i].jieshu=max(t[i-1].jieshu,t[i].jieshu);
			ans++;
		}
	}
//	cout<<ans<<endl;
	for(int i=n-1;i>=ans;i--){
//		cout<<1<<endl;
		u[ant].k1=t[i].kaishi;
		u[ant].k2=t[i].jieshu;
//		cout<<u[ant].k1<<endl<<u[ant].k2<<endl;
		ant++;
	}
	long long sum=0;
	for(int i=0;i<ant;i++){
		sum+=(u[i].k2-u[i].k1+1)*val;
	}
	cout<<sum<<endl;
}	

 

  • 6
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值