第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 签到题11题
Posted 小哈里
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 签到题11题相关的知识,希望对你有一定的参考价值。
目录
题号 标题 已通过代码 通过率 我的状态
A 大学期末现状 点击查看 3243/3868 未通过 (水题)
B G1024 点击查看 2855/6133 未通过(水题)
C NEUQ 点击查看 1843/6625 未通过(水题)
D 小G的任务 点击查看 2531/3531 未通过(水题)
E nn与游戏 点击查看 602/1642 未通过(BFS找最短路)(忘记去掉输出的调试值调了好久)
F 第二大数 点击查看 614/2276 未通过 (暴力枚举区间,维护最大值和次大值,记得开longlong) (开始没想到暴力能过)
G Num 点击查看 1775/10656 未通过 (N+1=(a+1)(b+1),判断质数) (绕进了奇偶性分类构造,没想到质因数分解公式)
H 特征值 点击查看 866/4223 未通过 (前缀和找规律) (规律不难发现,然后写了个字符串高精度WA了,改对以后TLE,然后改成数组继续TLE,想到可以枚举累加每位数还是TLE,想到可以直接前缀和终于过了)
I 最大公约数 点击查看 335/760 未通过( 按序列考虑,序列Ai=序列Ki*x,所以x个数即为sumAi的因数个数)
J 玄神的字符串 点击查看 676/2225 未通过(贪心取方案,然后分类讨论即可)
K 金牌厨师 点击查看 117/603 未通过(没看题,听说是个二分)
L WireConnection 点击查看 415/1667 未通过(建完全图跑最小生成树即可)
M NuclearReactor 点击查看 17/74 未通过(没看题,听说是个模拟)
1、大学期末现状
链接:https://ac.nowcoder.com/acm/contest/27302/A
来源:牛客网
题目描述
作为一名大学生的你,现在又到了期末查成绩的时候,当你的成绩大于等于60时请输出“jige,haoye!”,否则输出"laoshi,caicai,laolao"。
输入描述:
一行,一个整数x代表你的成绩(0<=x<=100)
输出描述:
一行字符串
示例1
输入
复制
60
输出
复制
jige,haoye!
#include<bits/stdc++.h>
using namespace std;
int main()
int x; cin>>x;
if(x>=60)cout<<"jige,haoye!";
else cout<<"laoshi,caicai,laolao";
return 0;
2、G1024
链接:https://ac.nowcoder.com/acm/contest/27302/B
来源:牛客网
题目描述
期末考试结束后,图灵杯出题组的几位同学卑微地留在校出题,但是由于疫情影响,他们不得不尽快乘坐G1024号火车离开学校 ,现在假设图灵杯出题组共nn人,并且通过APP可以知道G1024在接下来kk天的已购票数xx,总票数mm,现在Phenix想知道在所有人都一起上火车的前提下最早在第几天可以离开学校,如果无论怎样都无法离开请输出“G!”
输入描述:
第一行两个整数n,kn,k,表示出题组人数和天数(n,k<1000)(n,k<1000)
接下来kk行,第ii行两个整数x,mx,m表示接下来第ii天G1024的已购票数和总票数(0<=x<=m<1000)(0<=x<=m<1000)
输出描述:
一行,在所有人都一起上火车的前提下最早在第几天可以离开学校,如果不能离开请输出“G!”
示例1
输入
复制
7 5
100 100
99 100
95 100
900 1000
0 1000
输出
复制
4
#include<bits/stdc++.h>
using namespace std;
int main()
int n, k; cin>>n>>k;
for(int i = 1; i <= k; i++)
int x, m; cin>>x>>m;
if(m-x>=n)
cout<<i<<"\\n";
return 0;
cout<<"G!\\n";
return 0;
3、NEUQ
链接:https://ac.nowcoder.com/acm/contest/27302/C
来源:牛客网
题目描述
一天Phenix得到了一个长度为nn的字符串,字符串仅由大写字母A~Z组成,现在Phenix想知道最少需要删除多少个字符使字符串变成NEUQNEUQ……这种由若干个"NEUQ"组成的形式。
输入描述:
第一行一个整数nn,表示字符串长度(n<=10^6n<=10
6
)
第二行一个字符串
输出描述:
一个整数,表示最少需要删除的字符数量
示例1
输入
复制
10
NEUUQNEUQQ
输出
复制
2
示例2
输入
复制
9
ILOVENEUQ
输出
复制
5
#include<bits/stdc++.h>
using namespace std;
string p = "NEUQ";
int cur = 0;
int main()
int n; string s;
cin>>n>>s;
int ans = 0;
for(int i = 0; i < s.size(); i++)
if(s[i]==p[cur])
cur++;
if(cur==4)cur = 0;
else
ans++;
if(cur != 0)ans += cur;
cout<<ans<<"\\n";
return 0;
4、小G的任务
链接:https://ac.nowcoder.com/acm/contest/27302/D
来源:牛客网
题目描述
Phenix在验完题目之后,觉得图灵杯里面的简单题太多了,不符合图灵杯考验算法编程能力的初衷,决定增加一道难度更大的题目,将出题的任务交给了小G 。
众所周知,小G的水平十分有限,目前无法原创难度大的题目,于是他打算去各大oj里面白嫖题目 。
目前小G能查询到的oj一共有nn 个 , 对于第ii 个oj, 可以白嫖的难度合适题目数量我们定义为a_ia
i
,a_ia
i
的大小定义为 数字i 的各数位之和 。
例如 ,i = 233 , a_i = 2 + 3 + 3 = 8i=233,a
i
=2+3+3=8。
i = 2048 , a_i = 2 + 0 + 4 + 8 = 14i=2048,a
i
=2+0+4+8=14 。
现在给定 有nn 个oj可以白嫖 , 小G想知道,最后他有多少个题目可以白嫖 。
即求\\sum_i = 1^n a_i∑
i=1
n
a
i
。
输入描述:
一个正整数n <= 1000000n<=1000000
输出描述:
一个正整数表示有多少个题目可以白嫖
示例1
输入
复制
9
输出
复制
45
示例2
输入
复制
99
输出
复制
900
#include<bits/stdc++.h>
using namespace std;
int main()
int n; cin>>n;
int ans = 0;
for(int i = 1; i <= n; i++)
int x = i;
while(x)
ans += x%10;
x /= 10;
cout<<ans<<"\\n";
return 0;
5、nn与游戏
链接:https://ac.nowcoder.com/acm/contest/27302/E
来源:牛客网
题目描述
nn最近突然对做游戏非常感兴趣,于是他去找做游戏的xf询问相关话题,而xf此时正好在做一个游戏demo。
目前游戏中有一个n\\times nn×n大小的地图,里面有若干个可控制的己方单位、与己方单位同数量的敌对单位和一些障碍物。为了充分达成对各个单位的克制,玩家需要手动控制各个不同单位移动到自己所克制的敌对单位附近攻击。
现在xf将这样一个功能的实现强行塞给了nn:需要让玩家立刻了解到自己可控制的所有单位是否能绕过各个障碍移动到各自所克制的地方单位附近。
你能帮nn解决这个问题吗?
输入描述:
第11行输入nn,mm,代表该地图大小为n\\times nn×n,存在mm个障碍。
第2\\sim m+12∼m+1行每行依次输入x,yx,y,代表每个障碍的坐标位置。
第m+2m+2行输入tt,代表总共有tt个可控制单位和tt个敌对单位。
第m+3m+3行往后每行依次输入x_1,y_1,x_2,y_2x
1
,y
1
,x
2
,y
2
,(x_1, y_1)(x
1
,y
1
)代表一个己方可控制单位的位置,(x_2,y_2)(x
2
,y
2
)代表被其克制的敌对单位的位置(即该可控制己方单位的目标点)。
数据保证任何单位与障碍都不会出现重叠,地图的x,yx,y坐标都位于[0, n)[0,n)范围内。
1\\le n\\le 10^31≤n≤10
3
,0\\le m< 10^60≤m<10
6
1\\le t\\le 101≤t≤10,0\\le x, y, x_1, y_1, x_2, y_2< n0≤x,y,x
1
,y
1
,x
2
,y
2
<n
输出描述:
按可控制单位坐标的输入顺序输出各个可控制单位是否能抵达对应敌对单位所在位置,若能抵达,输出抵达对应位置所需的最短步数,否则输出-1。
注:寻路过程中需要考虑单位间的阻挡(即一个单位不管是可控制单位还是敌对单位,都会成为其他单位的障碍物),但因为只是计算一个时间点的事情,所以在计算时默认其他单位都在原来位置静止不动就行。
示例1
输入
复制
3 1
1 0
2
0 0 1 1
0 1 2 2
输出
复制
-1
3
说明
地图如下(a,b为可控制单位,对应克制的敌对单位为c,d,障碍物为1,空位置为0)
00d
bc0
a10
如图可见,a去c的路程被b和1挡住了,故输出-1;b可以通过向上,向右,向右,三步到达d,此路径为b到达d的最短路径,故输出3
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1010;
int a[1010][1010];
struct nodeint x, y, d=0;s[20], t[20];
int vis[maxn][maxn];
int dx[] = 0,0,-1,1;
int dy[] = 1,-1,0,0;
int main()
int n, m; cin>>n>>m;
for(int i = 1; i <= m; i++)
int x, y; cin>>x>>y;
a[x][y] = 1;
int T; cin>>T;
for(int i = 1; i <= T; i++)
int x1, y1, x2, y2; cin>>x1>>y1>>x2>>y2;
a[x1][y1] = i;
a[x2][y2] = i;
s[i].x = x1; s[i].y = y1;
t[i].x = x2; t[i].y = y2;
// for(int i = 0; i < n; i++)
// for(int j = 0; j < n; j++)
// cout<<a[i][j]<<" ";
//
// cout<<"\\n";
//
for(int i = 1; i <= T; i++)
queue<node>q;
s[i].d = 0;
q.push(s[i]);
memset(vis,0,sizeof(vis));
vis[s[i].x][s[i].y] = 1;
int ans = -1;
while(q.size())
node tmp = q.front();
q.pop();
for(int j = 0; j < 4; j++)
int nx = dx[j]+tmp.x, ny = dy[j]+tmp.y;
if(nx<0||nx>=n||ny<0||ny>=n)continue;
if(nx==t[i].x && ny==t[i].y)
ans = tmp.d+1;
break;
if(vis[nx][ny]==0 && a[nx][ny]==0)
q.push(nodenx,ny,tmp.d+1);
vis[nx][ny] = 1;
if(ans!=-1)break;
cout<<ans<<"\\n";
return 0;
6、第二大数
链接:https://ac.nowcoder.com/acm/contest/27302/F
来源:牛客网
题目描述
牛神对于第一的宝座感到厌倦,他开始研究第二大的贡献。
现在给你一个NN个数的排列PP,包含(1,2,…,N)(1,2,…,N),其中对于任给的一组(L,R)(L,R) ( 1 \\le L<R \\le N)(1≤L<R≤N) ,定义X_L,RX
L,R
为序列元素从下标LL到RR中第二大的数。
现在请聪明的你算出 \\sum_L=1N-1\\sum_R=L+1NX_L,R∑
L=1
N−1
∑
R=L+1
N
X
L,R
的结果,AC者可凭运气获得牛神签名照一张。
输入描述:
第一行为牛神想要研究的数字NN,其中2 \\le N \\le10^42≤N≤10
4
。
第二行为NN的一个排列。
输出描述:
输出包括一个整数,表示所求结果。
示例1
输入
复制
3
2 3 1
输出
复制
5
//题意:给出一个排列,定义X[l,r]为该区间中第二大的数,求所有区间的X之和。
//思路:直接暴力枚举区间! 假设知道了[l,r]的答案,对于[l,r+1],只需要检验a[r+1]能否更新最大值即可。
//if(a[r+1]>max)second=max,max=a[r+1]; if(a[r+1]>second)second =a[r+1].
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int maxn = 1e5+10;
LL a[maxn];
int main()
int n; cin>>n;
for(int i = 1; i <= n; i++)cin>>a[i];
LL first, second, ans = 0;
for(int i = 1; i < n; i++)
first = max(a[i], a[i+1]);
second = min(a[i],a[i+1]);
ans += second;
for(int j = i+2; j <= n; j++)
if(a[j]>first)
second = first;
first = a[j];
else if(a[j] > second)
second = a[j];
ans += second;
cout<<ans<<"\\n";
return 0;
7、Num
链接:https://ac.nowcoder.com/acm/contest/27302/G
来源:牛客网
题目描述
Phenix有一个正整数NN,他想知道正整数N是否可以写成ab+a+ba∗b+a+b的形式(其中a>0,b>0a>0,b>0)
例如3=11+1+13=1∗1+1+1,如果可以请输出"Yes",否则输出"No"
输入描述:
一个正整数N(0<N<2\\times10^9)N(0<N<2×10
9
)
输出描述:
“Yes”或者“No“
示例1
输入
复制
2
输出
复制
No
示例2
输入
复制
8
输出
复制
Yes
//假设N=a*b+a+b,两边同时加1,N+1=(a+1)(b+1)。
//那么N+1一定是由两个大于等于2的数相乘得到的,直接检验N+1是否大于等于4和N+1是否是质数即可。
#include<bits/stdc++.h>
using namespace std;
int main()
int n; cin>>n;
n++;
if(n < 4)cout<<"No"; return 0;
for(int i = 2; i*i<=n; i++)
if(n%i==0)cout<<"Yes"; return 0;
cout<<"No";
return 0;
//WA代码 87.5%
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1e5+10;
int main()
srand(time(0));
int x; cin>>x;
if(x==2 || x==3 || x==1)//WA+1
cout<<"No\\n";
else if(x%2==1)
cout<<"Yes\\n";
//x = 1*a+a+1
else
//偶 = 偶+偶 = 奇+奇
//ab+(a+b) , 奇*奇=奇,奇+奇=偶,
//所以a是偶,b是偶
int ok = 0, cc = 0;
for(int i = 2; i < x; i+=2)
if((x-i)%(i+1)==0 && (x-i)/(i+1)%2==0)
ok = 1; break;
if(i > 1000000)i += 4;
if(i > 100000000)i += 4;
cc++;
if(cc>500000000)
if(rand()%2==1)cout<<"Yes\\n";
else cout<<"No\\n";
return 0;
if(ok==1)cout<<"Yes\\n";
else cout<<"No\\n";
return 0;
8、特征值
链接:https://ac.nowcoder.com/acm/contest/27302/H
来源:牛客网
题目描述
最近捷宝学习了线性代数的知识,并成功在期末考试中获得了100分的好成绩。
其中计算矩阵的特征值这一题型给他留下深刻印象。
出于好奇心,他决定利用假期时间仔细钻研特征值这一概念。经过长达好多好多好多好多天的闭关研究,捷宝提出了整数的特征值这一概念。
可爱的捷宝定义,对于任意的正整数X,它的特征值的计算方式为: 特征值=\\sum_k=010100\\left\\lfloor\\fracX10^k\\right\\rfloor∑
k=0
10
100
⌊
10
k
X
⌋注:⌊ ⌋为向下取整,即不超过当前数字的最大整数(⌊3.2⌋=3,⌊2.9⌋=2,⌊7⌋=7)
现在捷宝想要把概念进行推广,他需要你帮忙设计一个程序,能够对于任意读入的一个正整数,快速计算它的特征值.
输入描述:
输入共包括1行,输入捷宝想要研究的数字X
其中1≤X<10500000
输出描述:
输出共包括一行,输出所研究数字的特征值
示例1
输入
复制
1225
输出
复制
1360
说明
1225+122+12+1=1360
示例2
输入
复制
99999
输出
复制
111105
说明
99999+9999+999+99+9=111105
示例3
输入
复制
314159265358979323846264338327950288419716939937510
输出
复制
349065850398865915384738153697722542688574377708317
备注:
提示:由于本题中读入数据的数据范围较大,所以可以考虑使用int类型的数组来存储X的每一位,以便于后续操作。
计算答案和输出答案也同理,可以使用数组来存储数字的每一位。
#include<bits/stdc++.h>
using namespace std;
const int maxn = 500010;
int x[maxn], len=1;
int s[maxn];
int main()
char ch;
while( (ch=getchar()) )
if(!isdigit(ch))break;
x[len] = (ch-'0');
s[len] = s[len-1]+x[len];
len++;
len--;
for(int i = len; i >= 1; i--)
s[i-1] += s[i]/10;
s[i] %= 10;
if(s[0]!=0)cout<<s[0];
for(int i = 1; i <= len; i++)printf("%d", s[i]);
return 0;
9、最大公约数
链接:https://ac.nowcoder.com/acm/contest/27302/I
来源:牛客网
题目描述
雯雯沉迷学习数学无法自拔,他在闭关修炼中遇到了难题,聪明的你能帮他解答吗?
现在给你一个NN个数的序列PP,定义XX为这NN个数的最大公因数,你可以进行无限次操作,每次操作选择一组(L,R)(L,R) ( 1 \\le L \\neq R \\le N,P_L\\ge1)(1≤L
=R≤N,P
L
≥1),使得P_L-1P
L
−1且P_R+1P
R
+1,每次操作产生新的序列PP。请问所有可能产生的PP对应的XX最多有多少个。AC者可凭RP获得雯雯签名照一张。
定义:AA是序列PP的一个公因数当且仅当序列PP的每一个元素都能被A整除,且A\\ge1A≥1。
注意:本题规定任何正整数都是0的公因数。
输入描述:
第一行包含一个数NN,其中2 \\le N \\le 5002≤N≤500。
第二行为长度为NN的一个序列,其中序列元素PP满足
1 \\le P \\le 10^61≤P≤10
6
。
输出描述:
输出包括一个整数,表示所有序列产生的最大公因数的个数。
示例1
输入
复制
3
1 1 2
输出
复制
3
说明
第一次操作,L=1,R=2L=1,R=2,操作后P=0,2,2P=0,2,2,此时PP的最大公因数为22。
第二次操作,L=2,R=3L=2,R=3,操作后P=0,1,3P=0,1,3,此时PP的最大公因数为11。
第三次操作,L=2,R=3L=2,R=3,操作后P=0,0,4P=0,0,4,此时PP的最大公因数为44。
经过若干次操作后,序列PP产生的最大公因数为11,22,44,共33个。
//题意:给出一个长为n的序列,每次可以选一组[l,r]令a[l]-1, a[r]+1产生一个新序列。每个序列有一个最大公约数X,求最多能产生多少个不同的X。
//思路:假设操作之后的序列为Ai,最大公约数为x,那么一定存在序列Ki满足Ai=x*Ki。由于操作不会改变sumKi的值,可以知道x是sum因子,所以直接计算sum的因子数即可。
以上是关于第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 签到题11题的主要内容,如果未能解决你的问题,请参考以下文章
第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 签到题11题
第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 K金牌厨师
第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 K金牌厨师
好题第九届“图灵杯”NEUQ-ACM程序设计竞赛个人赛 F-第二大数 思维