北京师范大学第十六届程序设计竞赛决赛-重现赛

本文主要是介绍北京师范大学第十六届程序设计竞赛决赛-重现赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A    塞特斯玛斯塔

链接:https://www.nowcoder.com/acm/contest/117/A
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

quailty是一名狂热的ACM音游选手,沉迷各种音乐游戏,比如Lunatic Rave 2,osu!之类的。

今天,quailty玩的是国内游戏厂商雷亚(并不是赞助商)出品的一款音乐游戏Cytus。

游戏中,玩家需要随着游戏界面中上下移动的扫描线来适时演奏对应音符。

当上下移动的黑色线(扫描线)与圆形的物体(音符)的圆心重合时点击音符。

普通音符(图中第一种)只需点击即可。

锁链音符(图中第二种)将带箭头的音符(滑块)按下后不要松开,并将滑块沿着斜线和圆点组成的路径拖动,直至拖动到最后一个圆点处方可松开。注意拖动过程中应保持滑块圆心始终与扫描线重合。

长按音符(图中第三种)按下后不要松开,原地不动,等扫描线到达其末端并显示判定结果后方可松开。

Cytus共有五种判定,从好到坏依次为:彩PERFECT、黑PERFECT、GOOD、BAD、MISS。

得分中包括了90%的“判定分”和10%的“连击分”,而连击分是累进计算的,断COMBO对其影响很大,往往只要有1个MISS就会损失几万的连击分。

彩PERFECT和黑PERFECT在计算得分时一视同仁,只要全部PERFECT即可获得满分,满分为1000000,被称为MILLION Master。

quailty真的很严格,如果打完一把没有拿到MILLION Master,他就认为自己是NAIVE Noob。

现在给你quailty打出的判定序列,请你输出这次游戏的评价是MILLION Master还是NAIVE Noob。


输入描述:

第一行是一个正整数T ( 1 ≤ T ≤ 5 ),表示测试数据的组数,
每组测试数据,第一行是一个正整数n ( 1 ≤ n ≤ 100000 ),表示该组测试数据包含的判定数。接下来的n行,每行包含"PERFECT"、"GOOD"、"BAD"、"MISS"之中的一个字符串,表示quailty打出的一个判定。

输出描述:

对于每组数据,输出一行,包含一个字符串,表示这次游戏的评价。
示例1

输入

2
5
PERFECT
PERFECT
PERFECT
PERFECT
PERFECT
10
PERFECT
MISS
PERFECT
BAD
BAD
GOOD
BAD
GOOD
GOOD
MISS

输出

MILLION Master
NAIVE Noob

思路:签到题目,前面全是废话。

代码:

#include <bits/stdc++.h>
using namespace std;
int main()
{int t;cin>>t;while(t--){int n;cin>>n;string str;bool flag = false;for(int i=1;i<=n;i++){cin>>str;if(str!="PERFECT"){flag = true;}}if(flag)cout<<"NAIVE Noob"<<endl;elsecout<<"MILLION Master"<<endl;}return 0;
}

C    萌萌哒身高差

思路;

(1)多写几个样例,找规律。2的时候3/3;3的时候8/3;4的时候15/3;5的时候24/3;6的时候35/3,可以发现n的时候就是((n*n)-1)/3即n方减一

代码:

#include <iostream>
#include <iomanip>2
using namespace std;
int main()
{int t;cin>>t;while(t--){int n;cin>>n;cout<<fixed<<setprecision(12)<<((n*n)-1.0)/3.0<<endl;}return 0;
}

(2)另一种思考方式,由于是全排列,对于n个数,总共有n*(n-1)/2种形式的差,且每种差出现次数相同,两重for循环即可求出所有形式的差出现一次的和sum,那么求出每种差出现的次数就可以求出差的总和。由于每一种顺序有n-1种差,有n!种序列,所以每次出现的次数为:n!*(n-1)/(n*(n-1)/2)=2*(n-1)!所以和即为:(sum*2*(n-1)!)/n! = sum*2/n即为答案。

代码:

#include<bits/stdc++.h>
using namespace std;typedef long long ll;const int N=1000010;
const int mod=1e9+7;
const int Max=0x3f3f3f3f;ll ans[N];
char ch[N];int main()
{int T;cin>>T;while(T--){int i,j;ll sum=0;int n;cin>>n;for(i=n;i>=1;i--){for(j=1;j<=n;j++){if(i>j)sum+=(i-j);}}double ans=(2.0*sum)/n;cout<<fixed<<setprecision(12)<<ans<<endl;}return 0;
}

D    雷电爆裂之力

链接:https://www.nowcoder.com/acm/contest/117/D
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

听说导体切割磁感线可以发电?
今天,zhuaiballl想要做切割磁感线运动,感受雷电的力量。
南北方向有四条马路,从西到东依次是京师路,木铎路,金声路和新街口外大街,可以看成是四条平行的数轴,且相邻的两条数轴之间距离为1m。东西走向有许多小道连接了相邻的马路。假设地磁南极和地理北极重合,地磁北极和地理南极重合。现在zhuaiballl位于京师路的某个位置,想要出发前往新街口外大街,速度为1m/s。由于可能没有一条路径从西到东一直连向新街口外大街,所以每次遇到丁字路口时,zhuaiballl需要选择是往左走还是往右走,样例如下图所示。

zhuaiballl想要感受尽可能强的雷电力量,所以希望从他开始往东走时开始,到他到达新街口外大街所需要的时间尽可能短。
现在,给你附近的地图,你能否求出从zhuaiballl开始往东走时开始,到他到达新街口外大街的最短时间?

输入描述:

 

第一行是一个正整数T(≤ 20),表示测试数据的组数,对于每组测试数据,第一行是一个整数n,m,k(1≤ n,m,k ≤ 100000),分别表示连接京师路与木铎路,木铎路与金声路,金声路与新街口外大街的道路个数,第二行包含n个以空格分隔的整数a1,a2,...,an,表示连接京师路与木铎路的各个小道的南北方向坐标(单位:m),第三行包含m个以空格分隔的整数b1,b2,...,bm,表示连接木铎路与金声路的各个小道的南北方向坐标(单位:m),第四行包含k个以空格分隔的整数c1,c2,...,ck,表示连接金声路与新街口外大街的各个小道的南北方向坐标(单位:m),保证每行坐标按严格递增的顺序给出,并且坐标绝对值不超过109

输出描述:

对于每组测试数据,输出一行,包含一个整数,表示答案(单位:s)。
示例1

输入

1
3 3 2
-1 1 4
-3 2 4
-1 1

输出

5

思路:

如果直接求需要三重循环,很明显是会超时,所以就要想办法优化,如何优化呢?首先,我们可以以中间路为一个分割点,求出左边到中间所需的距离,然后再求从右到中间的距离,这样就变成了两个for循环,减少时间。然后两者的和再加上3即为答案。那么如何求最小值呢?首先由于坐标值是递增的,所以我们以一个序列(b)遍历另一个序列(a),找最小的办法就是a从左往右找,只要比以前的最小值小就更新最小值,否则判断两个序列的值的大小,因为如果a序列的数大于b的,就没必要继续找下去了,记录当前a的位置,  接着继续b的下一个位置。详见代码:

(注意一个坑,inf一开始初始化为1e9)*3+10;结果一直是wa,无意中改了一下,结果AC了,真的是坑。。。)

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const LL MAX = 100010;
const LL INF = (1e9)*300+10;
LL a[MAX],b[MAX],c[MAX];
LL ma[MAX],mc[MAX];  ///ma是中间到左边最小,mc是中间到右边最小
int main()
{int t;LL n,m,k;cin>>t;while(t--){cin>>n>>m>>k;for(LL i=1;i<=n;i++){cin>>a[i];}for(LL i=1;i<=m;i++){cin>>b[i];ma[i] = INF;mc[i] = INF;}for(LL i=1;i<=k;i++){cin>>c[i];}LL pre = 1; ///记录上次找到那个位置,下次继续接着从此处寻找for(LL i=1;i<=m; i++){LL minn = INF;if(pre>n) pre=n;for(LL j=pre;j<=n;j++){if(fabs(b[i]-a[j])<minn)   {minn = fabs(b[i]-a[j]);pre = j;}else  //注意,此种情况就没必要再继续找下去{if(a[j]>b[i])break;}}ma[i] = minn;}pre =1;for(LL i=1;i<=m;i++){LL minn = INF;if(pre>k) pre = k;for(LL j= pre;j<=k;j++){if(fabs(b[i]-c[j])<minn){minn = fabs(b[i]-c[j]);pre = j;}else{if(c[j]>b[i])break;}}mc[i] = minn;}LL ans=INF;for(LL i=1;i<=m;i++){if(ans>(ma[i]+mc[i]))ans=ma[i]+mc[i];}ans+=3;cout<<ans<<endl;}return 0;
}

E 可以来拯救吗

思路:

简单的dfs即可,注意将k以n/2为界分成21部分,即小于等于n/2和大于n/2,然后利用Ck n 的性质来求解即可。

代码:

#include <iostream>
#include <cstring>
#include <cstdio>
using namespace std;
typedef long long LL;
const int maxn = 100005;
int n,k;
int T;
int a[maxn];
LL ans,sum;
void dfs1(int i,int len,int cnt)  ///处理小于等于n/2
{if(len>k) return;for(LL j=i+1;j<=n;j++){cnt+= a[j];if(len==k){ans = ans^(cnt * cnt);}else{dfs1(j,len+1,cnt);}cnt-=a[j];  //回溯}
}void dfs2(int i,int  len,int cnt)  ///处理大于n/2时的情况
{if(len>k) return;for(int j=i+1;j<=n;j++){cnt+=a[j];if(len == k){LL temp = sum-cnt;  //此处需要注意ans = ans^(temp * temp);}else{dfs2(j,len+1,cnt);}cnt-=a[j];}
}
int main()
{cin>>T;while(T--){cin>>n>>k;sum=0;for(int i=1; i<=n ; i++){cin>>a[i];sum+=a[i];}ans=0;if(k<=n/2){if(k==1){for(int i=1;i<=n;i++){ans = ans^(a[i] * a[i]);}}else{for(int i=1;i<=n-k+1;i++){dfs1(i,2,a[i]);}}}else        ///当k大于n/2时{k = n-k;if(k==0) ///特殊处理等于n的情况{ans = sum*sum;}else if(k==1){for(int i=1;i<=n;i++){ans=ans^((sum-a[i])*(sum-a[i]));  ///也就是当k=n-1时的情况}}else{for(int i=1;i<=n-k+1;i++){dfs2(i,2,a[i]);}}}cout<<ans<<endl;}return 0;
}


G    命名规范问题

链接:https://www.nowcoder.com/acm/contest/117/G
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

驼峰命名法是起变量名的一种规范,大致来说是用混合的大小写字母来构成变量名,在这个问题里你可以假设具体规则如下:

1.每个变量名由至少2个单词拼接构成,且每个单词长度至少为2;

2.每个单词的首字母必须大写,其他位置必须小写(除了变量名的第一个单词允许全部小写外)。

 

但是SK同学的英语很差,看到长长的变量名就很难脑补出是由哪些单词组成的,因此看驼峰命名法的代码十分头疼。

还有一种下划线命名法,规则比较简单,即各个单词之间用下划线'_'连接,且字母全部小写。

现在给你一些变量名,你能将其中符合驼峰命名法规范的变量转换成下划线命名法吗?

输入描述:

第一行是一个正整数T(≤ 20000),表示测试数据的组数,
每组测试数据只有一行,包含一个仅包含大小写英文字母且长度不超过20的变量名,
保证所有测试数据变量名长度总和不超过200000。

输出描述:

对于每组测试数据,输出一行,包含一个字符串,如果变量名符合驼峰命名法规范则将其改为下划线命名法,否则不变。
示例1

输入

10
mystring
myString
String
SS
my
mySString
mString
STRING
StrinG
IndexOfString

输出

mystring
my_string
String
SS
my
mySString
mString
STRING
StrinG
index_of_string

思路:

根据给的条件,模拟一遍即可

代码:

#include <iostream>
#include <cstring>
using namespace std;
char s[200005];void print(char *s)
{int len = strlen(s);for(int i=0;i<len;i++){cout<<s[i];}cout<<endl;
}int main()
{int t;cin>>t;while(t--){int num_upp=0;cin>>s;int len = strlen(s);for(int i=0;i<len;i++){if(s[i]<='Z' && s[i] >= 'A'){num_upp++;}}if(num_upp==0||(num_upp==1&&s[0]>='A'&&s[0]<='Z'))   ///当不满足(1)即1个变量至少两个单词的条件时直接输出{print(s);continue;}int num_low=0;bool flag=true;for(int i=0;i<len;i++){if(s[i]<='Z' && s[i]>='A'){if(i!=0 && num_low<2)   ///当不满足(2)每个单词至少由2个字母组成的条件时直接输出{flag=false;break;}num_low = 1;}else{num_low++;}}if(num_low<2) flag = false;///别忘记比较最后一个if(!flag){print(s);continue;}///以上两者均满足是进行下面string str="";for(int i=0;i<len;i++){if(s[i]>='A' && s[i]<='Z'){if(i!=0){str+="_";}str+='a'+(s[i]-'A');}else{str+=s[i];}}cout<<str<<endl;}return 0;
}

I    如何办好比赛

链接:https://www.nowcoder.com/acm/contest/117/I
来源:牛客网

时间限制:C/C++ 1秒,其他语言2秒
空间限制:C/C++ 32768K,其他语言65536K
64bit IO Format: %lld

题目描述

又到了一年一度的程序设计大赛了~
现在参赛选手在机房前排起了一列长队,这里面有萌新也有大佬,萌新都很仰慕大佬,由于大佬们的参赛,萌新们对这次比赛的精彩程度格外期待。对于每个萌新来说,他/她/它对本次的比赛的期待度为排在他/她/它前面的大佬的数量,而这次比赛的总期待度等于每个萌新的期待度之和。
SK同学作为本次比赛的组织者,希望比赛的期待度能够刚刚好,太低的话会让大家兴致不高,太高的话会被喷不满足预期。
现在SK同学可以交换任意相邻的两名参赛选手,但是比赛马上就要开始了,SK同学想知道最少要进行多少次交换才能使得这次比赛的总期待度刚好为k,你能帮帮他吗?

输入描述:

第一行是一个正整数T(≤ 10),表示测试数据的组数,
对于每组测试数据,
第一行是两个正整数n(≤ 1000000)和k(≤ 1000000000),分别表示队列长度和最终的比赛总期待度,
接下来一行包含n个字符,表示这个队列,第i个字符表示队列里的第i个人,'D'表示大佬,'M'表示萌新,保证不会出现其它字符。

输出描述:

对于每组测试数据,输出一行,包含一个整数,表示最少的交换次数,无解输出-1。
示例1

输入

2
3 1
DMM
3 3
DMM

输出

1
-1

思路:

首先过一遍数据,求出当前序列的期待值,然后判断是比k大还是k小,因为当D发生左移时,其实是每左移一位就加一,相反,右移减一,那么判断能否有加减得到k即可

代码:

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
char s[1000005];
int main()
{int t;cin>>t;while(t--){ll n,k;cin>>n>>k;cin>>s;ll n_d=0;ll num=0;for(int i=0; i<n; i++){if(s[i]=='D')n_d++;elsenum+=n_d;}if(num>=k)  //需要进行右移{ll sum=0;ll cnt=0;for(int i=n-1; i>=0; i--)  //注意从后往前看{if(s[i] == 'M' ) sum++;else  cnt+=sum;}if(num-cnt<=k) cout<<num-k<<endl;else cout<<-1<<endl;}else{ll sum=0;ll cnt=0;for(int i=0;i<=n-1;i++){if(s[i]=='M') sum++;else cnt+=sum;}if(num+cnt>=k) cout<<k-num<<endl;else cout<<-1<<endl;}}return 0;
}



  • 只要比以前的最小值小就更新最小值,

这篇关于北京师范大学第十六届程序设计竞赛决赛-重现赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/545273

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 参考论文 无水印

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次!  完整论文+代码+数据结果链接在文末!  订阅后可查看参考论文文件 第一问 1.1 问题重述 这个问题围绕的是华北山区的某乡村,在有限的耕地条件下,如何制定最优的农作物种植策略。乡村有 34 块露天耕地和 20 个大棚,种植条件包括粮食作物、蔬菜、水稻和食用菌。除了要考虑地块的面积、种植季节等,还要确保

kaggle竞赛宝典 | Mamba模型综述!

本文来源公众号“kaggle竞赛宝典”,仅用于学术分享,侵权删,干货满满。 原文链接:Mamba模型综述! 型语言模型(LLMs),成为深度学习的基石。尽管取得了令人瞩目的成就,Transformers仍面临固有的局限性,尤其是在推理时,由于注意力计算的平方复杂度,导致推理过程耗时较长。 最近,一种名为Mamba的新型架构应运而生,其灵感源自经典的状态空间模型,成为构建基础模型的有力替代方案

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围