CPPU程序设计训练营清明天梯模拟赛题解

感谢大家今天来做题

比赛地址:http://202.206.177.79/contest/8

由于博主比较菜,没做完所有题目,这里暂时仅提供前两部分的题解。

为了节约篇幅,题目及数据描述不再赘述,如有需求,请移步OJ查看。

感谢大家的辛苦付出,但是从这次比赛的结果来看,前行之路还非常非常漫长呐。

我寂寞的时候,会害怕踏出第一步。不会想到要去做什么事,所以,可能没有发觉很多很多的东西吧。——《夏目友人帐》

第一阶段

L1-1 天梯赛座位分配 (20分)

通过率:2.56% \(\;\;\) 通过人数:1

模拟题,整体难度大于后面几道题。此外对输出格式要求极为严苛,比较坑。

比较优秀的特点是数据范围不大,所以可以直接用 \(O(10*N*M)\) 的时间模拟编号过程(细节见代码)。

在每个学校都还有余量时,相临两位选手的座位号是以 \(N\) 为公差的等差数列,

但一旦有一些学校满编了,我们要在模拟的过程中跳过该校(要注意下 \(n\) 的后继是 \(1\)),

如果检测到当前只有一所学校有余量,需要隔座编号,我的代码使用了 \(add\) 累计隔座数量。

细心的同学可以发现输出描述有一句:行首尾不得有多余空格

这就比较魔性了,一般的题目行尾是可以有空格的,所以输出时格外注意格式(我第一次交就没看到这个)。

代码如下:

#include <bits/stdc++.h>
#define MAXN 107
using namespace std;
int n,pos,add,tot,p[MAXN];
vector<int> v[MAXN];
int main() {
	scanf("%d",&n);
	for (int i=1;i<=n;i++) {
		scanf("%d",&p[i]),p[i]*=10;
		tot+=p[i];
	}
	for (int i=1;i<=tot;i++) {
		int pre=pos;
		pos=(pos==n)?1:pos+1;
		while ((int)v[pos].size()==p[pos])
			pos=(pos==n)?1:pos+1;
		if (pre!=pos) v[pos].push_back(i); //正常编号
		else v[pos].push_back(i+(++add)); //仅剩一所学校有余量,要隔座
	}
	for (int i=1;i<=n;i++) {
		printf("#%d\n",i);
		for (int j=0;j<p[i];j++) {
			printf("%d",v[i][j]);
			putchar((j+1)%10?‘ ‘:‘\n‘); //行尾不能有空格
		}
	}
	return 0;
}

L1-2 倒数第N个字符串 (15分)

通过率:36.84% \(\;\;\) 通过人数:14

模拟题,用C++写应该比较简单,我头铁用Python搞了半天。

模拟的过程和数学上的加减法的进位/借位比较像,以从倒着数为例:

zba 的前驱是 zaz ,模拟的操作就是从后往前找到第一个不为a的字母,

然后把它之后的的所有a(如果有的话)改成z,计数器同时工作即可。

代码如下:

import math

def main():
    l, n = input().split()
    l = int(l); n = int(n)
    ans = ‘z‘ * l
    for i in range(n-1):
        pos = l - 1
        while ans[pos]==‘a‘: pos-=1
        ans = ans[:pos] + chr(ord(ans[pos])-1) + (l-pos-1)*‘z‘
    print(ans)

if __name__ == "__main__":
    main()

L1-3 倒数第N个字符串 (15分)

通过率:73.91% \(\;\;\) 通过人数:34

考察了最简单的数据处理以及读入输出,注意一下整形到浮点形的运算语法以及保留小数即可。

def main():
    a, b = input().split()
    ans = float(a)*float(b)/10
    print("%.2f" %ans)

if __name__ == "__main__":
    main()

L1-4 2018我们要赢 (5分)

通过率:63.46% \(\;\;\) 通过人数:33

这题通过率和通过人数还不如上一题,咋肥事啊。

直接输出!你敢送分我敢拿!

def main():
    print("2018")
    print("wo3 men2 yao4 ying2 !")

if __name__ == "__main__":
    main()

L1-5 电子汪 (10分)

通过率:59.62% \(\;\;\) 通过人数:31

考察了作为单身狗的口算水平,也没什么好说的。

def main():
    a, b = input().split()
    for i in range(int(a)+int(b)):
        print("Wang!", end=‘‘)

if __name__ == "__main__":
    main()

L1-6 福到了 (15分)

通过率:18.97% \(\;\;\) 通过人数:11

模拟题,细节要求比较多。

题目所要求的倒置指的是整图旋转 \(180°\),满足的性质是 \(map[i][j] -> map[n-i+1][n-j+1]\),

简单观察一下样例可以知道,把列倒过来,再把行倒过来就倒置了。

判断是否输出bu yong dao le可以使用上面那个性质,如果每一个坐标都满足就要输出。

def main():
    k, n = input().split()
    n = int(n)
    l = []; r = []
    for i in range(n):
        opt = input().replace(‘@‘, k).ljust(n, ‘ ‘)
        l.append(opt)
    for i in range(n-1, -1, -1):
        t = list(l[i]).reverse()
        r.append(l[i][::-1])
    fl = 0
    for i in range(n):
        if l[i] != r[i]:
            fl = 1; break
    if fl == 0: print("bu yong dao le")
    for i in range(n):
        for j in range(len(r[i])):
            if r[i][j]!=‘ ‘: print(k, end=‘‘)
            else: print(‘ ‘, end=‘‘)
        print(‘\n‘, end=‘‘)

if __name__ == "__main__":
    main()

原文地址:https://www.cnblogs.com/zhwer/p/12634446.html

时间: 2024-10-08 08:55:39

CPPU程序设计训练营清明天梯模拟赛题解的相关文章

【前行】◇第3站◇ 国庆训练营&#183;OI制模拟赛

[第3站] 国庆训练营·OI制模拟赛Ⅰ 怀着冲刺提高组400的愿望来到这个very small but very interesting 的训练营QwQ 在北大dalao的带领下开始了第一场OI模拟赛[炸心态ヽ(*.>Д<)o゜] ? 简单总结 感觉非常爆炸…… 第一题还好,一眼看出结论题,所以开始打表……没想到只打出来了一种情况(为什么全是特殊情况),然后就凉了. 第二题就开始崩溃了.首先画图思考了大概20分钟……然后发现想不出正解,就开始想要骗分.看了看数据阶梯,发现自己好像只能做前1/3

10-4国庆节第七场模拟赛题解

10-4 国庆节第七场模拟赛题解 T1工厂 (factory) 水 #include<iostream> #include<cstdio> #define int long long using namespace std; inline int read(){ int sum=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){ if(ch=='-')f=-1; ch=getchar(); } while(ch>='0

10月15日模拟赛题解

10月15日模拟赛题解 A 树 Description 给定一棵 \(n\) 个节点的树,每个节点有两个参数 \(a,~b\),对于每个节点,求子树中参数为 \(b\) 的所有节点的 \(a\) 之和 Limitations \(100\%\) \(1 \leq b \leq n \leq 10^5,~a \leq 1000\) \(60\%\) \(1 \leq b,n\leq 1000\) \(30\%\) \(1 \leq b, n \leq 10\) Solution 对于 \(30\%

lzoi模拟赛题解

A题:签到题原题:mtoi 联赛 的A题定位:真.签到题(普及B题或者提高d1A题)考点:选手的基本数学能力思维难度:提高-代码难度:普及A题 题解:80%:暴力枚举100%:注意到(a xor b)<=(a+b),于是把所有的数异或起来即可. B题:送分题原题:[多省省队联测]d2A:皮配定位:一道联赛d1B题,考察了选手的基本功.送了选手70分.把70%的2种做法扩展可以得到正解考点:多种背包dp,计数思维难度:提高代码难度:提高+ 前面的几个数据可以暴力枚举解决.50%的数据:考虑dp.设

计蒜课 八月模拟赛题解

看见机房有大佬上周写了上面的普及信心赛 于是我康了康 8月的提高组模拟赛 9月的还没开始qwq 真的 有点难 主要是我先打开了T2 我再次 对自己的数学产生了怀疑 我现在还是不会写T2 T1 又又又又都错题了 下次重建图 尽量写vector 都写 邻接表 变量差不多的容易搞混 我这个同学变又写错了 T1 :https://nanti.jisuanke.com/t/41086 题目大意就是 一个有向图 删一个点 把与他直接和间接 相连的点 删掉 然后 求删掉所有点的最小最大代价 : 为了避免这个环

10-3国庆节第六场模拟赛题解

T1 炮 (cannon) Description Makik 曾经沉迷于打麻将,热衷于点炮的他近日终于开始爱上了中国象棋.面对一个n×m的棋盘,他不禁陷入了思考:在这张棋盘上摆"炮",并且任意两个"炮"之间不会互相攻击的方案数究竟有多少呢? 说明:两枚炮可以互相攻击,当且仅当它们处在同一行或同一列上且恰好间隔一枚棋子,即"炮打隔山". 由于 Makik 记不住太大的数字,所以请告诉他答案对 999983 取模的结果. Input 输入文件包含一

10-2国庆节第五场模拟赛题解

T1 seq: 序列2 (seq) Description 给定个长度为 n 的数列 {a},初始时数列中每个元素 a_i 都不大于 40.你可以在其上进行若干次操作.在一次操作中,你会选出相邻且相等的两个元素,并把他们合并成一个元素,新的元素值为 \((旧元素值+1)\). 请你找出,怎样的一系列操作可以让数列中的最大值变得尽可能地大?这个最大值是多少? Input 输入文件第一行一个正整数 n,表示数列的长度. 接下来一行 n 个不大于 40 的正整数,表示这个数列 {a }. Output

@省选模拟赛03/16 - T3@ 超级树

目录 @description@ @solution@ @accepted code@ @details@ @description@ 一棵 k-超级树(k-SuperTree) 可按如下方法得到:取一棵深度为 k 的满二叉树,对每个节点向它的所有祖先连边(如果这条边不存在的话). 例如,下面是一个 4-超级树: 请统计一棵 k-超级树 中有多少条不同的简单有向路径,对 mod 取模. input 一行两整数 k, mod. output 一行一整数表示答案. example input1: 2

【题解】PAT团体程序设计天梯赛 - 模拟赛

由于本人愚笨,最后一题实在无力AC,于是只有前14题的题解Orz 总的来说,这次模拟赛的题目不算难,前14题基本上一眼就有思路,但是某些题写起来确实不太容易,编码复杂度有点高~ L1-1 N个数求和 设计一个分数类,重载加法运算符,注意要约分,用欧几里得算法求个最大公约数即可. 1 #include <cstdio> 2 3 long long abs(long long x) 4 { 5 return x < 0 ? -x : x; 6 } 7 8 long long gcd(long