2020-2021年度第二届全国大学生算法设计与编程挑战赛题解(冬季赛)

你在最后那场博弈中败下阵来,却意外穿越到了海拉尔大陆!是你吗林克?

初来到海拉尔大陆的你,有些许的局促,但当你看到塔,或许一切的一切都迎刃而解。

一个层高为n的字母塔的定义为:

共n行,由字母组成的等腰三角形。
塔顶为第一层,且只有一个大写字母A;下面每一层都比上面一层多两个字母。
每一层都是左右对称。
对于第i层,前i个字母由大写字母表中A~第i个字母顺序组成。

为了稳住局面,样例给出了层高为5的字母塔,请你输出层高26的字母塔。

#include <stdio.h>
/***********************************
观察题目样例给出的高为5层的塔,可以得出以下几个规律
对于一个高为n层的塔而言,首先设最上面一层(顶层)为第一层。
1. 对于第i层而言,其字符的排列规律为:大写字母表中从第1个字符(A)~第i个字符,后又倒序从第i-1个字符~第1个字符(A)。
2. 第1~n-1层每层前都有空格,具体而言,对于第i行,字符前面的空格个数为n-i个。
找出以上规律后,我们就可以根据这些规律构造出答案:层高26的塔。

TIPS:
大写字母'A'为大写字母表第一个字符
对于大写字母表中第i个字符,可以使用'A'+i-1得到。
例如:第5个字符为'E',亦即为:'A'+5-1
***********************************/
int main() {
    char c1;
    int n = 26; //设定塔的层数为26
    int i, j;
    for (i = 1; i <= n; i++) {   //对塔每一层按照规律进行构造。
        //首先进行输出空格的操作:对于第i行,字符前面的空格个数为n-i个。
        for (j = 1; j <=n-i; j++)
            printf(" ");
        for (j = 1; j <= i; j++) { //按照规律1,输出第1~第i个大写字母。
            c1 = j + 'A' - 1; //第j个大写字母为'A'+j-1
            printf("%c", c1); //输出第j个大写字母
        }
        for (j = i-1; j >= 1; j--) {//按照规律1,输出第i-1~第1个大写字母,注意是倒序
            c1 = j+'A'-1;
            printf("%c", c1);
        }
        printf("\n");//第i行输出结束,进行换行。
    }
    return 0;
}

日记

题目描述:

看着林林色色的塔,你的心里有些许的安稳,在询问路人时你得知了,你正身处「卡卡利科村」,似乎帕雅也在那里?

好久没有偷窥帕雅的日记了

你喜欢偷窥帕雅日记一事已广为人知,帕雅特地在日记本上加了密。

加密的方式很简单:对于一串字符串,如果其中有l,i,n,k,e这五个字母当中的任意一个,帕雅都会在这后面加上bt再加上原来的字母已加密,如love就会加密成lbtlovebte。

下面给出帕雅日记的第一页内容,请你根据他的日记内容进行解密。

ibti lbtlovebte lbtlibtinbtnkbtkebtezbas jebte dosadnbtna ovakbtkebtemibtijaxaszxdbtddbtddbtddbtddbtddbtd

注意上面内容为一行内容,没有任何换行,若网页显示多行只是文本显示宽度问题。

建议查看PDF。

但这能拦得住你吗?时间紧迫,快解密吧!

#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<set>
#include<string>
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
ll lst[Max];


int main()
{
	string str = "ibti lbtlovebte lbtlibtinbtnkbtkebtezbas jebte dosadnbtna ovakbtkebtemibtijaxaszxdbtddbtddbtddbtddbtddbtd";
	string ans = "";
	for (int i = 0;i <= str.size() - 1;i++)
	{
		ans += str[i];
		if (str[i] == 'l'||str[i]=='i'||str[i]=='n'||str[i]=='k'||str[i]=='k'||str[i]=='e')i+=3;
	}
	cout << ans;
}

神仙爱采药

题目描述:

您是一个神仙,但您很喜欢采药。

您有一个神奇的背包,背包内有VV个格子。

您所在的空间内有一些药,每个药会占用 11 或 22 个格子。

每天可以进行一次如下操作:

采摘一个药材放入背包中,若此时背包中没有多余的格子来放入新的药材,可以先将背包中的若干药材扔出去,至于扔多少以及扔几个,全都由您决定。当然您也可以选择不去进行采摘操作。

每一天结束前,神奇背包中的每个药材都会产生一个药丸。

作为神仙,您知道每天您可以采摘的药材类型(即占用格子数目),注意,当天的药材如果不采摘,在第二天就会消失(当天药材仅限当天采摘)。

为了获得尽可能多的药丸,请您计算最终能获得的药丸数目最多是多少?

贪心,体积还剩时有多少取多少,当体积不够后再将体积2的扔掉取体积1的,注意答案会爆int。

#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<set>
#include<string>
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
ll lst[Max];


int main()
{
	ll v;cin >> v;
	ll ans = 0, sumv = 0, numz = 0, num2 = 0;
	string str;cin >> str;
	for (ll i = 0;i < str.size();i++)
	{
		ll p = str[i] - '0';
		if (p + sumv <= v)
		{
			if (p == 2)num2++;
			numz++;
			sumv += p;
		}
		else
		{
			if (num2 >= 1 && p == 1)
			{
				sumv--;
				num2--;
			}
		}
		ans += numz;
	}
	cout << ans;
}

奇怪的小鸭子也增加了

题目描述:

这题是个签到题。

有一个 A×B 的大澡盆,还有若干个a×b的长方形小鸭子,澡盆里最少放几只鸭子后,便无法再向其中放入更多的鸭子?

鸭子很倔强,不能旋转成 b * a ,也不能重叠放置

#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
#include<set>
#include<string>
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
ll lst[Max];


int main()
{
	ll x, y, a, b;cin >> x >> y >> a >> b;
	ll ans = 0;
	ll h = x / (a + a), s = y / (b + b);
	if (x % (a + a) >= a)h++;
	if (y % (b + b) >= b)s++;
	cout << h * s;
	return 0;
}

奇怪的传输机也增加了

在这里插入图片描述

YE5和N0注意!

#include<iostream>
#include<string>
#include<map>
#include<algorithm>
#include<memory.h>
#include<cmath>
#include<iomanip>
#define pii pair<int,int>
#define FAST ios::sync_with_stdio(false),cin.tie(0),cout.tie(0)
using namespace std;
typedef long long ll;
const int Max = 1e6 + 5;
int lst[Max];

int main()
{
	int n, x, y;cin >> n >> x >> y;
	double sum = n, yu = n;
	int s = 0;
	for (int i = 1;i <= y;i++)
	{
		s++;
		sum = sum * 2 / 3;
		if (s >= x)
		{
			sum += yu / 2;
			s = -199999;
		}
		if (sum < n / 32)
		{
			cout << "N0!" << endl;
			cout << i << " " << fixed << setprecision(6) << sum;
			return 0;
		}
	}
	cout << "YE5!" << endl;
	cout << fixed << setprecision(6) << sum;
	return 0;
}

字符串:待补…

在这里插入图片描述

  • 3
    点赞
  • 24
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

_Rikka_

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

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

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

打赏作者

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

抵扣说明:

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

余额充值