第二十届浙大宁波理工学院程序设计大赛(同步赛)个人题解

第二十届浙大宁波理工学院程序设计大赛(同步赛)个人题解

别怀疑,就是给你写的

1.Storious与三角之恋

题目描述
Storious非常的迷恋三角形。Storious认为,除了三角恋和三脚猫,三角形是世界上最稳定的结构!

为了让大家感受三角形的魅力,Storious邀请你来编写程序,输出杨辉三角形前五行中第 n 行的内容(中间不带空格)。
如果不知道什么是杨辉三角形,请查看样例。
输入描述:
输入一个整数 n ( 1≤n≤5 ),表示输出杨辉三角形前五行中第 n 行的内容(中间不带空格)。
输出描述:
输出一个字符串,表示输出的杨辉三角形前五行中第 n 行的内容(中间不带空格)。

思路:签到题(打表)

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n;
	cin >> n;
	if (n == 1) {
		cout << 1 << endl;
	}
	else if (n == 2) {
		cout << 11 << endl;
	}
	else if (n == 3) {
		cout << 121 << endl;
	}
	else if (n == 4) {
		cout << 1331 << endl;
	}
	else {
		cout << 14641 << endl;
	}
	return 0;
}

2.Gray与坤变偶不变

题目描述
Gray正在研究穿越数学:“坤变偶不变,符号看象限。”

Gray得到了一个长度为 N 的字符串 S ,其内容仅可能是英文字母。Gray希望把字符串中所有位于奇数位置的字母改变大小写,然后打印出新的字符串。

通俗的来说,对于字符串中第 1,3,5… 个字符,需要改变大小写,如果原字符是大写,改为小写;如果原字符是小写,改为大写。
为了检测Gray打印的结果是否正确,请你编写一个程序,输出正确的打印结果。
输入描述:
第一行输入一个正整数 N ( 1≤N≤104 ),表示字符串的长度。
第二行输入一个字符串 S (保证 S 的长度为 N ,其内容仅可能是英文字母),表示需要打印的字符串。
输出描述:
输出一个字符串,表示正确的打印结果。

思路:签到题

代码:

#include <iostream>
#include <cstdio>
using namespace std;
int main()
{
	int n;
	cin >> n;
	string s;
	cin >> s;
	for (int i = 0; i < n; i+=2) {
		if (islower(s[i])) {
			s[i] = s[i] - 'a' + 'A';
		}
		else {
			s[i] = s[i] - 'A' + 'a';
		}
	}
	cout << s << endl;
	return 0;
}

3.Gray与你好谢谢小笼包再见

题目描述
Gray正在看"Bell看中外合拍的《唐可可的诱惑》"。(BV1g541197LM,关注猫芒ベル喵关注猫芒ベル谢谢喵

《唐可可的诱惑》是中外合拍的都市情感伦理二创肥皂剧。其中,唐可可穿着小千的衣服,对香音说"你好…谢谢小笼包再见"的场景,深深地创进了Gray心中。

Gray于是决定去他最爱的早餐店买小笼包。不幸的时候,此时已是 h1 点 m1 分(24小时制,不含前导零),而这家店的小笼包好吃到不可思议,已经卖完了!

吃不到小笼包的Gray感觉身上仿佛有蚂蚁在爬。为了能买到小笼包,Gray设置了闹钟,会在每天的 h2 点 m2 分响起,提醒Gray买小笼包。

Gray站在空荡荡的早餐店前,他想知道,闹钟下一次响起是在多少小时多少分钟后。(如果此刻闹钟正在响,闹钟下一次响起被认为是 (24 小时 0 分钟后)。
输入描述:
第一行输入一个正整数 T(1≤T≤2073600 ),表示有 T 组测试数据。对于每组测试数据:
输入一行四个整数 h1,m1,h2,m2 ( 0≤h1,h2≤23,0≤m1,m2≤59 ),表示此刻的时间和闹钟的设置时间。
输出描述:
输出 T 行,其中第 i 行对应第 i 组测试数据。
对于每组测试数据:
输出一行两个整数 h3,m3 ,表示闹钟下一次响起是在 h3 小时 m3 分钟后。

思路:计算h1m1到h2m2的时间间隔(注意有顺序,只能h2m2-h1m1),先看今天响了没有(h2m2-h1m1是否大于等于0),如果已经响了就直接h2m2-h1m1,如果还没有,则只能等到第二天再响,就需要计算h1m1到今天结束的时间加上第二天开始到h2m2的时间即为答案

#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
signed main()
{
	IOS;
	ll t;
	cin >> t;
	while (t--) {
		ll h1, m1, h2, m2;
		cin >> h1 >> m1 >> h2 >> m2;
		ll mm1 = h1 * 60 + m1;
		ll mm2 = h2 * 60 + m2;
		if (mm1 < mm2) {
			ll a = mm2 - mm1;
			ll h3 = a / 60;
			ll m3 = a % 60;
			cout << h3 << " " << m3 << endl;
		}
		else if (mm1 > mm2) {
			ll a = 24 * 60 - mm1 + mm2;
			ll h3 = a / 60;
			ll m3 = a % 60;
			cout << h3 << " " << m3 << endl;
		}
		else {
			cout << 24 << " " << 0 << endl;
		}
	}
	return 0;
}

4.Gray与派对80

题目描述
Gray这周末会举办一个超棒的派对,许多知名人物都会出席。但你猜,谁收不到邀请?
派对会邀请曾经参加过校赛的参赛者们。我们假设,至今为止一共有 N 位参加过校赛的参赛者,他们的编号从 1 到 N 。如果一位参赛者第一次参加的校赛是第 i 届校赛,则他被认为是第 i 届参赛者。
第一届校赛只有一个人参加,他是编号为1 的第一届参赛者。第二届及之后的每一届校赛的参赛者,都是被上一届的参赛者邀请来的。参赛者在第一次参加校赛后,可以邀请多个人参加下一届的校赛,但只会邀请还从未参加过校赛的人。一个人最多只会被邀请一次,就是说,不会出现同时有多个人邀请同一个人参加校赛的情况。其中,编号为 i 的参赛者是被编号为 ai 的参赛者邀请的。(特殊的,1 号参赛者没有被人邀请过,所以 (a1 =0 ,代表邀请他的人不存在。)

如果一名参赛者被邀请来了派对,但他发现邀请他参加校赛的人没有被邀请来派对,他就会很难过。如果一名参赛者被邀请来了派对,但他发现有和他同届的参赛者没有被邀请来派对,他也会觉得很难过。至于 1 号参赛者?他有着伟大的性格,他总是很开心!

由于场地大小有限,Gray只能邀请部分参赛者来派对。但他希望派对上的所有人都不会感到难过,都能开心的参加派对!在这个基础上,他希望邀请尽可能多的人来参加派对。

现在有Q 个场地可供选择,用以举办派队。如果选择在第i 个场地举办派对,因为场地大小限制,最多只能邀请bi个人。Gray想知道,如果选择在第 i 个场地举办派对,在满足场地大小限制,且保证没有人会难过的前提下,最多只能邀请多少人参加派对?
输入描述:
第一行输入一个正整数 N,表示共有 N 位参赛者。
第二行输入 N 个正整数,a1 ,a2 ,a3 …a N
a1=0 ;对于任意 2≤i≤N 满足 (1≤a≤i ),其中 ai表示 i 号参赛者是被 a i号参赛者邀请来参加校赛。

第三行输入一个正整数 Q ,表示共有 Q 个场地可供选择。
第四行输入 Q 个正整数,对于任意 1≤i≤N 满足 1≤b≤N,其中 表示如果选择在第 i 个场地举办派对,只考虑场地大小限制,最多只能邀请 b i个人。
输出描述:
输出 Q 行,每行输出一个整数。其中,第 i 行输出的整数,表示如果选择在第 i 个场地举办派对,在满足场地大小限制,且保证没有人会难过的前提下,最多只能邀请多少人参加派对。

思路:如果邀请一个人,必须邀请邀请这个人的人和与这个人同届的所有人,比如我邀请了第二届的某个人,就必须邀请第二节的所有人和第一届的那个人。如果我邀请了第三届的一个人,就必须邀请第三届的所有人和第二届邀请这个人的人,如果邀请了第二届的一个人那么第二届的所有人和第一届的那个人也会被邀请。(可能有点绕,慢点读)也就是要用到前缀和的知识,用ans数组把每一届的人数统计出来,然后用x数组求ans数组的前缀和,最后遍历场地大小,求出每个场地大小最多能邀请的人数

代码:

#include<bits/stdc++.h>
#include <algorithm>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
struct Node{
	int a, t;
}node[100010];
int b[100010];
ll n, q;
int ans[100010];//第i届比赛的人数
int x[100010];
int maxm = 0;//最多届数
int binarySearchLastLE(int nums[], int x) {
	int low = 1;
	int high = maxm;
	int result = -1;  // 初始化一个无效的索引,方便判断找不到的情况

	while (low <= high) {
		int mid = low + (high - low) / 2;

		if (nums[mid] <= x) {
			result = mid;  // 当前mid满足条件,记录结果,但继续在右半部分继续寻找更后面的匹配项
			low = mid + 1;
		}
		else {
			high = mid - 1;
		}
	}

	return result != -1 ? nums[result] : -1;  // 返回结果,如果找不到则返回-1或其他合适的值
}
signed main()
{
	IOS;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		cin >> node[i].a;
	}
	node[1].t = 1;
	ans[1] = 1;
	for (int i = 2; i <= n; i++) {
		node[i].t = node[node[i].a].t + 1;
		ans[node[i].t]++;
		maxm = max(maxm, node[i].t);
	}
	x[1] = ans[1];//前缀和
	for (int i = 2; i <= maxm; i++) {
		x[i] = x[i - 1] + ans[i];
	}
	cin >> q;
	for (int i = 1; i <= q; i++) {
		cin >> b[i];
		if (b[i] == 0) {
			cout << 0 << endl;
			continue;
		}
		cout << binarySearchLastLE(x, b[i]) << endl;
	}
	return 0;
}

5.Gray与XX启动

题目描述
Gray是资深云玩家。他可以在不下载游戏的情况下云玩各种游戏!

Gray在云玩游戏时发现了一个五角星☆法阵,五角星☆的五个顶点上各有一个火把。这五个火把按顺时针顺序被编号为
A,B,C,D,E 。

Gray可以进行一种操作。每次操作,可以选择一个灭着的火把,把它点亮,但这会导致与它不相邻的两个火把变成相反的状态(灭着的被点亮,亮着的被熄灭)。

例如:
如果 A 火把是灭着的,可以点亮 A 火把,这会导致 C 火把和 D 火把变成相反的状态,但不会改变 B 火把和 E 火把的状态。
如果 C 火把是灭着的,可以点亮 C 火把,这会导致 A 火把和 E 火把变成相反的状态,但不会改变 B 火把和D 火把的状态。
其他火把同理。

Gray希望通过尽可能少的操作次数把五角星☆法阵启动,启动法阵需要把火把从当前状态变成指定的状态。

为了判断Gray的操作次数是否是最少的,请你输出启动法阵的最少操作次数。

如果不可能启动法阵,输出 −1 。
输入描述:
第一行输入一个正整数 T ,表示有 T 组测试数据。

对于每组测试数据:

第一行输入五个整数 A,B,C,D,E ( 0≤A,B,C,D,E≤1 )。表示当前状态,其中 0 表示此编号的火把未被点亮, 1 表示此编号的火把已被点亮。

第二行输入五个整数A,B,C,D,E ( 0≤A,B,C,D,E≤1 )。表示指定状态,其中 0 表示此编号的火把未被点亮, 1 表示此编号的火把已被点亮。
输出描述:
输出 T 行,其中第 i 行对应第 i 组测试数据。
对于每组测试数据:输出一行一个整数,代表启动法阵的最小操作次数。如果不可能启动法阵,输出 −1 。

思路:DFS,函数f的参数sum表示点亮的次数,注意只能点亮不能熄灭

代码:

#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
ll n, sum, sum1, sum2, sum3;
ll a[5];
ll ans[5];
int asw = 100010;
void f(int a[],int sum) {
	if (sum >= 10) {
		return;
	}
	int flag = 1;
	for (int i = 0; i < 5; i++) {
		if (a[i] != ans[i]) {
			flag = 0;
		}
	}
	//判断是否达到目的
	if (flag == 1) {
		//更新最小点亮次数
		asw = min(asw, sum);
	}
	for (int i = 0; i < 5; i++) {
		if (a[i] == 0) {
			//点亮自身
			a[i] = 1;
			//点亮不相邻的两个火把
			a[(i + 2) % 5] = 1 - a[(i + 2) % 5];
			a[(i + 3) % 5] = 1 - a[(i + 3) % 5];
			//将点亮次数+1继续递归
			f(a, sum + 1);
			//递归完进行回溯
			a[i] = 0;
			a[(i + 2) % 5] = 1 - a[(i + 2) % 5];
			a[(i + 3) % 5] = 1 - a[(i + 3) % 5];
		}
	}
}
signed main()
{
	IOS;
	int n;
	cin >> n;
	for (int i = 0; i < n; i++) {
		for (int j = 0; j < 5; j++) {
			cin >> a[j];
		}
		for (int j = 0; j < 5; j++) {
			cin >> ans[j];
		}
		f(a, 0);
		if (asw == 100010) {
			asw = -1;
		}
		cout << asw << endl;
		asw = 100010;
	}
	return 0;
}

6,7,8题有点长,懒得看了•ࡇ•

9.Gevin的RGB区间和

题目描述
给你一个2≤n≤1000,且 n 必定为偶数)大小的二维数组,二维数组上有三块不同颜色的区间
请你求出三个区间内的元素和。
(颜色在边缘的长度一个是 n/2)在这里插入图片描述

输入描述:
输入一个 n 表示二维数组的大小(2≤n≤10的3次方 ,且 n 必定为偶数)

下面 n 行输入 n 个整数a[i][j](1≤a[i][j]≤10的3次方)
输出描述:
分别输出三个区间的元素和

思路:模拟,在输入的过程中就用一个sun来记录所有数的和。然后计算R区域的和,B区域的和,G区域用sum-R-B

代码:

#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
ll n, sum, sum1, sum2, sum3;
ll a[2000][2000];
signed main()
{
	IOS;
	cin >> n;
	for (int i = 1; i <= n; i++) {
		for (int j = 1; j <= n; j++) {
			cin >> a[i][j];
			sum += a[i][j];
		}
	}
	for (int i = 1; i <= n / 2; i++) {
		for (int j = 1; j <= n / 2; j++) {
			if (i + j <= n / 2 + 1) {
				sum1 += a[i][j];
			}
		}
	}
	for (int i = n; i > n / 2; i--) {
		for (int j = n; j > n / 2; j--) {
			if (n-i+1+n-j+1<=n/2+1) {
				sum2 += a[i][j];
			}
		}
	}
	sum3 = sum - sum1 - sum2;
	cout << sum1 << " " << sum3 << " " << sum2 << endl;
	return 0;
}

10.Gevin的打印服饰

题目描述
我们来打印出一个服饰吧!
给你一个参数 n(5≤n≤30),表示服饰的大小,如下图:

请你找出规律,打印其他大小的衣服。

输入描述:
输入一个整数 n(5≤n≤30)表示衣服的大小
输出描述:
请你通过上面的规律,打印对应大小的服
在这里插入图片描述在这里插入图片描述在这里插入图片描述

思路:纯纯模拟找规律,看代码应该能看懂

代码:

#include<bits/stdc++.h>
#define IOS std::ios::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);
#define ll long long
#define int long long
#define endl "\n"
using namespace std;
signed main()
{
	IOS;
	int n;
	cin >> n;
	for (int i = 0; i < n - 1; i++) {
		cout << " ";
	}
	for (int i = 0; i < n; i++) {
		cout << "*";
	}
	for (int i = 0; i < n - 1; i++) {
		cout << " ";
	}
	cout << endl;
	int x = 1;
	for (int i = n-3; i >= 0; i--) {
		char a[1000];
		for (int i = 0; i < 1000; i++) {
			a[i] = ' ';
		}
		a[i + 1] = '*';
		a[i + 1 + x+1] = '*';
		a[n + n - 1+(n-3-i)] = '*';
		a[n + n - 1 - x+(n - 3 - i)-1] = '*';
		for (int j = 0; j < 3 * n - 2; j++) {
			cout << a[j];
		}
		cout << endl;
		x += 2;
	}
	for (int i = 0; i < n; i++) {
		cout << "*";
	}
	for (int i = 0; i < n - 2; i++) {
		cout << " ";
	}
	for (int i = 0; i < n; i++) {
		cout << "*";
	}
	cout << endl;
	for (int i = 0; i < n - 1; i++) {
		cout << " ";
	}
	for (int i = 0; i < n; i++) {
		cout << "*";
	}
	for (int i = 0; i < n - 1; i++) {
		cout << " ";
	}
	cout << endl;
	int t = 2;
	for (int i = 0; i < n - 3; i++) {
		for (int j = 0; j < n - 1; j++) {
			cout << " ";
		}
		char a[1000];
		for (int j = 0; j < 1000; j++) {
			a[j] = ' ';
		}
		a[0] = '*';
		a[n - 1] = '*';
		a[n-t-1] = '*';
		for (int j = 0; j < n; j++) {
			cout << a[j];
		}
		for (int j = 0; j < n - 1; j++) {
			cout << " ";
		}
		t++;
		cout<<endl;
	}
	for (int i = 0; i < n - 1; i++) {
		cout << " ";
	}
	for (int i = 0; i < n; i++) {
		cout << "*";
	}
	for (int i = 0; i < n - 1; i++) {
		cout << " ";
	}
	return 0;
}

结束了喵(◍˃̶ᗜ˂̶◍)✩

  • 24
    点赞
  • 18
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论
“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届程序设计同步题解“中国东信杯”广西大学第四届

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

JalenG

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值