比赛链接:\(link\)
T1 分饼干 I
题目描述
洛谷网校举行了期末考试,同学们经过课程的学习,考出了优异的成绩。
Z 在考试中获得了第一名,yz 在考试中获得了第二名,老师决定买一些饼干奖励两名小朋友。
老师买了三盒饼干,第一盒有 \(a\) 块饼干,第二盒有 \(b\) 块饼干,第三盒有 \(c\) 块饼干。老师决定将这三盒饼干奖励给 Z 和 yz,三盒饼干不可以被拆开奖励。
老师希望 Z 拿到的饼干块数不少于 yz,但又希望两人拿到的饼干数量差距尽可能小,请问 Z 和 yz 各拿到几块饼干?
输入格式
输入一行三个整数,分别为 \(a,b,c\)。
输出格式
输出一行两个整数,由空格分隔。第一个整数代表 Z 拿到的饼干数量,第二个整数代表 yz 拿到的饼干数量。
样例 #1
样例输入 #1
3 1 5
样例输出 #1
5 4
样例 #2
样例输入 #2
3 3 5
样例输出 #2
6 5
提示
样例解释 1
Z 拿走 \(5\) 块饼干,yz 拿走 \(3+1=4\) 块饼干。
样例解释 2
Z 拿走 \(3+3=6\) 块饼干,yz 拿走 \(5\) 块饼干。
思路
由题意可知,分配给两人的饼干必定是一人一盒,另一人两盒。
所以暴力求解,列出三种情况。其中拿到两盒饼干的人分别可能是\(a+b,a+c,b+c\)。于是分别求解即可。
代码实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int a,b,c;
cin>>a>>b>>c;
int _[3]={a+b,a+c,b+c};
int _1=abs(_[0]-c);
int _2=abs(_[1]-b);
int _3=abs(_[2]-a);
int mn=min(_1,min(_2,_3));
if(mn==_1)
{
cout<<max(_[0],c)<<" "<<min(_[0],c)<<endl;
}
else if(mn==_2)
{
cout<<max(_[1],b)<<" "<<min(_[1],b)<<endl;
}
else if(mn==_3)
{
cout<<max(_[2],a)<<" "<<min(_[2],a)<<endl;
}
return 0;
}
T2 分饼干 II
题目描述
老师有 \(N\) 块饼干,要分给 \(k\) 名小朋友。
每名小朋友至少拿到一块饼干,老师想让每名小朋友拿到的饼干数量都不一样多,请问老师能否实现这个目标。
输入格式
本题单个测试点内有多组测试数据。
输入共 \(T + 1\) 行。
输入第一行为一个整数 \(T\),代表测试数据组数。
接下来 \(T\) 行,每行两个整数,分别为 \(N,k\)。
输出格式
输出共 \(T\) 行,依次对应 \(T\) 组测试数据。如果该组测试数据
- 可以实现,输出
Yes
。 - 无法实现,输出
No
。
样例 #1
样例输入 #1
1
1 1
样例输出 #1
Yes
样例 #2
样例输入 #2
1
5 3
样例输出 #2
No
提示
数据规模与约定
- 对于 \(50\%\) 的测试数据 \(1 \le k \le 1000\),\(1 \le N \le 10^6\)。
- 对于 \(100\%\) 的测试数据,\(1 \le k,N \le 10^9\)。
思路
设想一个长度为\(k\)的序列,由\(1~k\)构成,和为\(n\),这正好是一个符合题意的饼干分配方式。
于是转化成数学,将\(n\)循环减去\(1~k\)。若最后\(n\)没有被正好减成\(0\),说明该序列不存在。
代码实现
#include<bits/stdc++.h>
using namespace std;
int main()
{
ios::sync_with_stdio(false);
int t;
cin>>t;
while(t--)
{
int n,k;
cin>>n>>k;
int j=1,flag=1;
do{
n-=j;
if(n<0)
{
cout<<"No"<<endl;
flag=0;
break;
}
j++;
}while(j<=k);
if(flag==1) cout<<"Yes"<<endl;
}
return 0;
}
T3 跳房子
题目背景
跳房子,也叫跳飞机,是一种世界性的儿童游戏,也是中国民间传统的体育游戏之一,趣味性、娱乐性极强,曾深受广大儿童的喜爱。
题目描述
现在我们给出一种简易跳房子游戏的玩法:
\(n\) 个格子从左到右一字形排开,从左到右依次被标号为 \(1, 2, \cdots, n\)。每一个格子上都有一个正整数,\(i\) 号格子上的正整数是 \(a _ i\)。
这个游戏的规则如下:初始时玩家站在 \(1\) 号格子上,需要做若干次跳跃。每一次跳跃时,玩家需要从当前格子向前跳「当前格子上写的整数」数量的格子。形式化地讲,如果玩家当前处于 \(x\) 号格子,玩家需要跳到 \(x + a _ x\) 号格子上。
如果玩家跳到 \(n\) 号格子右侧的位置,称玩家出界;如果玩家恰好跳到 \(n\) 号格子上,称玩家胜利。这两种情况下玩家都需要停止跳跃。
现在给定格子数量和格子上的整数,你需要求解:
- 在停止跳跃后,玩家是否胜利。即,玩家是否能够恰好跳到 \(n\) 号格子上。
- 在停止跳跃后,玩家跳跃的总次数。
输入格式
输入共两行。
第一行为一个整数 \(n\),代表格子的数量。
第二行为 \(n\) 个整数 \(a _ 1, a _ 2, \cdots, a _ n\),代表每个格子上的数字。
输出格式
输出共两行。
第一行为一个字符串。如果玩家在停止跳跃后恰好跳到 \(n\) 号格子上,输出 Yes
,否则输出 No
。
第二行一个整数,代表玩家的总跳跃次数。
样例 #1
样例输入 #1
6
1 1 3 7 8 5
样例输出 #1
Yes
3
样例 #2
样例输入 #2
4
2 7 3 5
样例输出 #2
No
2
提示
样例 1 解释
样例 2 解释
数据规模与约定
对于 \(100\%\) 的数据,保证 \(1 \leq n \leq 10 ^ 6\),\(1 \leq a _ i \leq 10 ^ 4\)。
测试点编号 | \(n\) | 特殊性质 |
---|---|---|
\(1\) | \(= 1\) | 无 |
\(2 \sim 4\) | \(\leq 100\) | 无 |
\(5\) | \(\leq 10 ^ 6\) | \(a _ i = 1\) |
\(6, 7\) | \(\leq 10 ^ 6\) | \(a _ i = 2\) |
\(8 \sim 10\) | \(\leq 10 ^ 6\) | 无 |
思路
由题意,模拟。
代码实现
#include<bits/stdc++.h>
using namespace std;
int a[1000005];
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
int i;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
i=1;
int ans=0;
bool flag=0;
while(i<=n)
{
if(i==n)
{
flag=1;
break;
}
i+=a[i];
ans++;
}
if(flag)
{
cout<<"Yes"<<endl<<ans<<endl;
}
else if(!flag)
{
cout<<"No"<<endl<<ans<<endl;
}
return 0;
}
T4 区间函数最小值
题目描述
给定 \(A, B, C, D, E, F, G, P, X_1, X_2, Y_1, Y_2\),求当 \(X _ 1 \leq x \leq X _ 2\),\(Y _ 1 \leq y \leq Y _ 2\) 且 \(x, y\) 均为整数时
\[f(x, y) = (A x ^ 3 + B y ^ 3 + C x ^ 2 y + Dxy ^ 2 + Exy + Fx + Gy) \bmod P \]的最大值。
输入格式
输入共一行十二个整数 \(A, B, C, D, E, F, G, P, X_1, X_2, Y_1, Y_2\)。
输出格式
输出一个整数,代表 \(f(x, y)\) 的最大值。
样例 #1
样例输入 #1
3 2 5 6 1 4 2 998244353 1 2 1 3
样例输出 #1
266
提示
样例解释 #1
当 \(x\) 为 \(1\) 到 \(2\) 之间的整数,\(y\) 为 \(1\) 到 \(3\) 之间的整数时,函数 \(f(x,y)\) 的值如下:
\[f(1,1)=23,\ f(1,2)=63,\ f(1,3)=139\\ f(2,1)=70,\ f(2,2)=144,\ f(2,3)=266 \]最大值为 \(f(2,3)\),即 \(266\)。
数据规模与约定
对于 \(100\%\) 的数据,保证 \(1 \leq A, B, C, D, E, F, G, P \leq 10 ^ 9\),\(1 \leq X _ 1 \leq X _ 2 \leq 10 ^ 3\),\(1 \leq Y _ 1 \leq Y _ 2 \leq 10 ^ 3\)。
思路
由题意,循环枚举每种可能的\(x,y\),进行求解\(f\)函数。
代码实现
#include<bits/stdc++.h>
using namespace std;
long long a,b,c,d,e,f,g,p,x1,x2,y1,y2,mx=-1;
long long solve(long long x,long long y)
{
return ((a*x*x*x)+(b*y*y*y)+(c*x*x*y)+(d*x*y*y)+(e*x*y)+(f*x)+(g*y))%p;
}
int main()
{
ios::sync_with_stdio(false);
cin>>a>>b>>c>>d>>e>>f>>g>>p>>x1>>x2>>y1>>y2;
for(long long x=x1;x<=x2;x++)
{
for(long long y=y1;y<=y2;y++)
{
mx=max(mx,solve(x,y));
}
}
cout<<mx<<endl;
return 0;
}
T5 小跳蛙
题目背景
idea 提供者: bj12z_jiasiyuan
验题:卷王
题目描述
有 \(n - 1\) 只小跳蛙在池塘中,依次被编号为 \(1, 2, \cdots, n - 1\)。池塘里有 \(n\) 个位置,每一个位置上有一个数字 \(a_i\)。如果 \(a_i = 0\),则表示这个位置是一个空位;否则表示这个位置上存在一个编号为 \(a_i\) 的小跳蛙。
接下来的 \(n-1\) 分钟,小跳蛙们将进行跳跃。第 \(i\) 分钟,编号为 \(i\) 的小跳蛙将跳到空位上。
请你输出 \(n-1\) 分钟后池塘中每个位置的数字,即每个位置是否为空、小跳蛙编号是多少。
输入格式
输入共两行。
第一行一个整数 \(n\)。
第二行 \(n\) 个整数 \(a _ 1, a _ 2, \cdots, a _ n\)。
输出格式
输出一行 \(n\) 个整数 \(a _ 1, a _ 2, \cdots, a _ n\)。 表示 \(n-1\) 分钟后池塘的状态。
样例 #1
样例输入 #1
5
1 2 0 3 4
样例输出 #1
2 3 1 4 0
提示
样例解释 #1
- 第一分钟后池塘状态:
0 2 1 3 4
- 第二分钟后池塘状态:
2 0 1 3 4
- 第三分钟后池塘状态:
2 3 1 0 4
- 第四分钟后池塘状态:
2 3 1 4 0
因此最终池塘的状态为 2 3 1 4 0
。
数据规模与约定
对于 \(50\%\) 的数据,\(1 \leq n \leq 10 ^ 3\)。
对于 \(100\%\) 的数据,\(1 \leq n \leq 10^6\),保证序列 \(a\) 是一个 \(0 \sim n - 1\) 这些数字的排列。
思路
每个跳蛙都会跳到每上一个跳蛙跳跃的起始点。换成数学,就是每个元素都\(+1\),元素\(n-1\)变为\(0\)。
代码实现
#include<bits/stdc++.h>
using namespace std;
int a[1000005],b[1000005];
int main()
{
ios::sync_with_stdio(false);
int n;
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
b[i]=a[i]+1;
if(a[i]==n-1) b[i]=0;
cout<<b[i]<<" ";
}
return 0;
}
T6 图像变换
题目描述
一张字符图片由 \(n\) 行 \(m\) 列,共 \(n\times m\) 个字符组成,第 \(i\) 行第 \(j\) 列的字符为 \(s_{i,j}\)。如下图所示,为一个 \(4\times 3\) 的字符图片。
%%%
$$$
@w@
!!!
现在,需要将图像放大 \(k\) 倍,得到 \(kn \times km\) 的图片。原图片的每个字符都需要重复 \(k^2\) 次,作为新图像中 \(k\times k\) 的一个区域,各字符的相对位置不变。
将上面给出的例子放大 \(2\) 倍,将得到如下图像:
%%%%%%
%%%%%%
$$$$$$
$$$$$$
@@ww@@
@@ww@@
!!!!!!
!!!!!!
输入格式
输入 \(n+1\) 行。
输入的第一行为三个整数 \(n,m,k\)。
接下来 \(n\) 行,每行 \(m\) 个字符,表示字符图片。
输出格式
输出 \(nk\) 行,每行 \(mk\) 个字符,表示变换后的字符图片。
样例 #1
样例输入 #1
4 3 2
%%%
$$$
@w@
!!!
样例输出 #1
%%%%%%
%%%%%%
$$$$$$
$$$$$$
@@ww@@
@@ww@@
!!!!!!
!!!!!!
提示
数据规模与约定
- 对于 \(30\%\) 的测试数据,输入的字符画仅包含一种字符;
- 对于 \(100\%\) 的测试数据,\(1 \le n, m \le 100\),\(1 \le k \le 10\),输入的字符仅包含 ASCII 码不超过 127 的可见字符。
思路
事实上,这是将每个字符二维拓展k倍。
代码中,\(i,j\)控制字符坐标,\(v,l\)控制二维放大倍数。
代码实现
#include<bits/stdc++.h>
using namespace std;
char s[102][102];
int main()
{
ios::sync_with_stdio(false);
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++)
{
for(int j=0;j<m;j++)
{
cin>>s[i][j];
}
}
for(int i=0;i<n;i++)
{
for(int v=0;v<k;v++)
{
for(int j=0;j<m;j++)
{
for(int l=0;l<k;l++)
{
cout<<s[i][j];
}
}
cout<<endl;
}
}
return 0;
}
T7 二进制与一
题目描述
给定一个正整数 \(n\),以及操作次数 \(q\)。对于每次操作,给出一个正整数 \(k\),要求:让 \(n\) 加上一个非负整数 \(x\),使得 \(n\) 在二进制下的第 \(k\) 位(从右往左数)是 \(1\),并在符合要求的情况下,令 \(x\) 最小。
请注意,每次操作都会让 \(n\) 变为 \(n + x\),会影响后续操作。
小山需要求出,所有的 \(x\) 之和是多少。
输入格式
输入共 \(q + 1\) 行。
第一行两个整数 \(n\) 和 \(q\)。
接下来 \(q\) 行,每行一个正整数 \(k\),表示要让 \(n\) 在二进制下从右往左数的第 \(k\) 位是 \(1\)。
输出格式
一行一个整数,表示所有的 \(x\) 之和。
样例 #1
样例输入 #1
5 3
2
3
4
样例输出 #1
3
提示
样例 1 说明
\(5\) 在二进制下是 \(101\)。
- 对于第一次操作,需要让 \(101\) 的第二位变为 \(1\),则需让 \(101\) 加上 \(1\),变为 \(110\);
- 对于第二次操作,需要让 \(110\) 的第三位是 \(1\),由于 \(110\) 的第三位本身就是一,所以无需改变;
- 第三次操作同理,需要让 \(110\) 加上 \(2\)。
最终输出结果是 \(1+0+2=3\)。
数据规模与约定
对于 \(100\%\) 的数据,\(1\le n < 2^{32},1\le q\le 10^5,1 \le k\le 32\)。
测试点编号 | \(n\) | \(q\) | \(k\) |
---|---|---|---|
\(1\) | \(\leq 4\) | \(\leq 10\) | \(\leq 2\) |
\(2, 3\) | \(\leq 4\) | \(\leq 10\) | \(\leq 32\) |
\(4, 5\) | \(\leq 1024\) | \(\leq 1000\) | \(\leq 10\) |
\(6, 7\) | \(< 2 ^ {32}\) | \(\leq 10\) | \(\leq 32\) |
\(8 \sim 10\) | \(< 2 ^ {32}\) | \(\leq 10 ^ 5\) | \(\leq 32\) |
思路
完善中……
代码实现
To be continued.
T8 Genshin 玩家
题目背景
你说得对,后面忘了。
题目描述
在洛谷入门赛/语言月赛出题 QQ 群里,著名洛谷管理员蓝边铅球老师的群名片是『原神玩家』。
现在,扶苏给了你一个字符串 \(s\),她想请你求出:有多少种方案可以在 \(s\) 中取出两个子串 \(s[l_1, r_1], s[l_2, r_2]\),满足:
- \(1 \leq l_1 \leq r_1 \leq l_2 \leq r_2 \leq |s|\),这里 \(|s|\) 表示字符串 \(s\) 的长度。
- \(s[l_1, r_1]\) 表示由 \(s\) 的第 \(l_1\) 个字符到第 \(r_1\) 个字符构成的字符串,\(s[l_1, r_1] = \texttt{Genshin}\)。
- \(s[l_2, r_2]\) 表示由 \(s\) 的第 \(l_2\) 个字符到第 \(r_2\) 个字符构成的字符串,\(s[l_2, r_2] = \texttt{player}\)。
两个方案不同,当且仅当两个方案中 \(l_1, r_1, l_2, r_2\) 至少有一个对应不同。
输入格式
输入只有一行,表示字符串 \(s\)。
输出格式
输出一行一个整数表示答案。
样例 #1
样例输入 #1
Genshinplayerplayer
样例输出 #1
2
样例 #2
样例输入 #2
ExpectedIsAGenshinplayerWhoLikesToBeAGenshinplayer
样例输出 #2
3
提示
数据规模与约定
- 对 \(30\%\) 的数据,保证 \(|s| \leq 50\)。
- 对 \(60\%\) 的数据,保证 \(|s| \leq 200\)。
- 对 \(100\%\) 的数据,保证 \(1 \leq |s| \leq 2000\),\(s\) 中仅含大小写英文字母。
思路
先循环遍历字符串找Genshin
的位置,因为player
一定要在Genshin
后,所以在找到Genshin
之后再找player
。
代码实现
#include<bits/stdc++.h>
using namespace std;
const string _1="Genshin",_2="player";
int main()
{
ios::sync_with_stdio(false);
string s;
int ans=0;
cin>>s;
for(int i=0;i<s.length();i++)
{
string str=s.substr(i,7);
if(str==_1)
{
for(int j=i;j<s.length();j++)
{
str=s.substr(j,6);
if(str==_2) ans++;
}
}
}
cout<<ans<<endl;
return 0;
}
备注
T7正完善中~~~。
标签:10,洛谷,leq,19,题解,样例,int,输出,饼干 From: https://www.cnblogs.com/j1hx-oi/p/17975649