第一题
One Clue
问题陈述
在数轴上有20000012000001块石头,这些石头的坐标分别为-1000000, -999999, -999998, \ldots, 999999, 1000000−1000000,−999999,−999998,…,999999,1000000。
其中,连续的KK块石头被涂成了黑色,其余的则是白色的。
此外,我们知道位于坐标XX的那块石头是黑色的。
请按升序打印所有可能含有黑色石头的坐标。
约束条件
- 1 \leq K \leq 1001≤K≤100
- 0 \leq X \leq 1000≤X≤100
- 输入中的所有值均为整数。
输入
输入从标准输入中以如下格式给出:
K X
输出
按升序打印所有可能含有黑色石头的坐标,坐标之间用空格隔开。
示例输入 1
3 7
Copy
示例输出 1
5 6 7 8 9
Copy
我们知道有三块连续的黑色石头,并且坐标为77的石头是黑色的。有三种可能性:
- 黑色石头分别位于坐标55、66和77。
- 黑色石头分别位于坐标66、77和88。
- 黑色石头分别位于坐标77、88和99。
因此,可能含有黑色石头的五个坐标为:55、66、77、88和99。
示例输入 2
4 0
Copy
示例输出 2
-3 -2 -1 0 1 2 3
Copy
负坐标也可能包含黑色石头。
示例输入 3
1 100
Copy
示例输出 3
100
这道题其实就是考虑 x-(k-1)一次缩小了1
加上x加上x+ (k+1)每次增大一到k减一
,代码如下,
#include<bits/stdc++.h>
using namespace std;
int n,a;
int main(){
// freopen("loop.in","r",stdin);
// freopen("loop.out","w",stdout);
cin>>n>>a;
if(n==1)
{
cout<<a;
return 0;
}
for(int i=n-1;i>=1;i--)
{
cout<<a-i<<" ";
}
cout<<a<<" ";
for(int i=1;i<=n-1;i++)
{
cout<<a+i<<" ";
}
return 0;
}
第二题
B. Shift
问题描述
给定一个长度为NN的序列A = (A_1, A_2, \dots, A_N)A=(A1,A2,…,AN)。
你将执行以下操作KK次:
- 删除AA的初始元素并在AA的尾部添加一个00。
打印所有操作后的AA的元素。
约束
-
1 \leq N \leq 1001≤N≤100
-
1 \leq K \leq 1001≤K≤100
-
1 \leq A_i \leq 1001≤Ai≤100
-
输入中的所有值都是整数。
输入
从标准输入以以下格式给出输入:
NN KK
A_1A1 A_2A2 \dots… A_NAN
输出
在一行中打印操作后的AA的元素,用空格分隔。
样例输入1
3 2
2 7 8
样例输出1
8 0 0
在进行操作之前,A = (2, 7, 8)A=(2,7,8)。
进行一次操作后,A = (7, 8, 0)A=(7,8,0)。
进行两次操作后,A = (8, 0, 0)A=(8,0,0)。
因此,(8, 0, 0)(8,0,0)是答案。
样例输入2
3 4
9 9 9
样例输出2
0 0 0
样例输入3
9 5
1 2 3 4 5 6 7 8 9
样例输出3
6 7 8 9 0 0 0 0 0
这道题在考试中用了我很大时间,我在考试中把这道题想的太复杂了,其实只需要一个一个的去。
嗯模拟就行。但是我的思路则是用这种个值。减去从第几个值开始,从这个值开始往后输出就再输出n个零。
考试中的代码如下
#include<bits/stdc++.h>
using namespace std;
int n,a,b[110],a1,a2;
int main(){
// freopen("loop.in","r",stdin);
// freopen("loop.out","w",stdout);
cin>>n>>a;
for(int i=1;i<=n;i++)
{
cin>>b[i];
}
if(a>=n)
{
for(int i=1;i<n;i++)
{
cout<<"0"<<" ";
}
cout<<"0";
return 0;
}
a1=n-a;
for(int i=a+1;i<=n;i++)
{
cout<<b[i]<<" ";
}
for(int i=1;i<=a;i++)
{
cout<<"0"<<" ";
}
return 0;
}
第三题。
Bovine Bones
题目描述
Bessie 喜欢玩棋盘游戏和角色扮演游戏,因此她让 John 带她去了一家小店买了三个骰子。这三个骰子分别有 S1S1、S2S2 和 S3S3 面。每面的数字是 11 到骰子的面数,每个数字出现的概率相等。Bessie 想要知道在所有可能的骰子组合中,哪个三个骰子点数之和出现得最频繁。如果多个和出现的频率相同,报告最小的那个和。
数据范围
- 2 \leq s_1 \leq 202≤s1≤20
- 2 \leq s_2 \leq 202≤s2≤20
- 2 \leq s_3 \leq 402≤s3≤40
输入格式
第一行包含三个用空格分隔的整数:S1S1、S2S2 和 S3S3。
输出格式
输出一行,包含那个出现最频繁的最小整数和。
示例
样例输入 #1
3 2 3
Copy
样例输出 #1
5
Copy
提示
以下是所有可能的结果:
1 1 1 -> 3
1 2 1 -> 4
2 1 1 -> 4
2 2 1 -> 5
3 1 1 -> 5
3 2 1 -> 6
1 1 2 -> 4
1 2 2 -> 5
2 1 2 -> 5
2 2 2 -> 6
3 1 2 -> 6
3 2 2 -> 7
1 1 3 -> 5
1 2 3 -> 6
2 1 3 -> 6
2 2 3 -> 7
3 1 3 -> 7
3 2 3 -> 8
这道题其实就是用三重for循环。
就能解决。
考试中的代码如下
#include<bits/stdc++.h>
using namespace std;
int n,m,s,a[110000],maxx=-999999;
int main(){
// freopen("loop.in","r",stdin);
// freopen("loop.out","w",stdout);
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=s;k++)
{
// cout<<i<<" "<<j<<" "<<k<<" "<<endl;
a[i+j+k]++;
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=s;k++)
{
if(a[i+j+k]>maxx)
maxx=a[i+j+k];
}
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
for(int k=1;k<=s;k++)
{
if(a[i+j+k]==maxx)
{
cout<<i+j+k;
return 0;
}
}
}
}
return 0;
}
第四题。
Glass and Mug
问题陈述
AtCoder公司销售玻璃杯和马克杯。
高桥有一个容量为GG毫升的玻璃杯和一个容量为MM毫升的马克杯,满足G<MG<M。
最初,玻璃杯和马克杯都是空的。在执行以下操作KK次之后,确定玻璃杯和马克杯中分别含有多少毫升的水。
- 如果玻璃杯装满了水(即玻璃杯恰好含有GG毫升的水),则将玻璃杯中的水全部倒掉。
- 否则,如果马克杯是空的,则给马克杯加满水。
- 否则,从马克杯向玻璃杯转移水,直到马克杯为空或玻璃杯被装满为止。
约束条件
- 1\leq K\leq 1001≤K≤100
- 1\leq G<M\leq 10001≤G<M≤1000
- GG、MM和KK均为整数。
输入
输入从标准输入中以如下格式给出:
KK GG MM
输出
在执行操作KK次后,按顺序打印玻璃杯和马克杯中含有的水量(以毫升为单位),中间用空格隔开。
示例输入 1
5 300 500
Copy
示例输出 1
200 500
Copy
操作将按照以下步骤进行。最初,玻璃杯和马克杯都是空的。
- 给马克杯加满水。此时,玻璃杯有00毫升,马克杯有500500毫升的水。
- 将水从马克杯转移到玻璃杯,直到玻璃杯被填满。此时,玻璃杯有300300毫升,马克杯有200200毫升的水。
- 将玻璃杯中的水全部倒掉。此时,玻璃杯有00毫升,马克杯有200200毫升的水。
- 将水从马克杯转移到玻璃杯,直到马克杯为空。此时,玻璃杯有200200毫升,马克杯有00毫升的水。
- 给马克杯加满水。此时,玻璃杯有200200毫升,马克杯有500500毫升的水。
因此,在五次操作后,玻璃杯中有200200毫升,马克杯中有500500毫升的水。故应依次打印200200和500500,中间用空格隔开。
示例输入 2
5 100 200
Copy
示例输出 2
0 0
这道题题目其实就是让我们按照这个要求去走。但是需要特判一个条件。
如果
马克杯给玻璃杯倒水,玻璃杯满,那马克杯就不能倒了。
如果马克杯dow没了,玻璃杯还没满。那我马克杯还得再装。
代码如下
#include<bits/stdc++.h>
using namespace std;
int n,m,s,a,b,maxx=-999999;
int main(){
// freopen("loop.in","r",stdin);a pole
// freopen("loop.out","w",stdout);b mak
cin>>n>>m>>s;
for(int i=1;i<=n;i++)
{
if(a==m)
{
a=0;
}
else if(b==0)
{
b=s;
}
else
{
if(a+b>=m)
{
b=b-(m-a);
a=m;
}
else
{
a+=b;
b=0;
}
}
}
cout<<a<<" "<<b;
return 0;
}