秋游活动
学校举行秋游活动。 由于这次秋游活动来的人太多, 学校租了三辆大巴车来把学生运到秋游营地。 但是由于三辆车型号不一样, 所以跑一趟往返所需的时间也不一样。 小明来到停车场时, 正好见到三辆车同时发车。 好奇的他想知道, 如果他在这里等着, 过多久才能看见下一次三辆车同时发车。
输入格式
包含一行三个数, 分别表示每一辆车跑一次往返所需的分钟数(不超过 100 分钟) , 用空格分开 。
输出格式
包含一个数, 为小明所需等待的时间(分钟数) 。
输入/输出例子1
输入:
4 6 3
输出:
12
代码:
#include<bits/stdc++.h>
using namespace std;
int a,b,c,sum=1;
int main(){
cin>>a>>b>>c;
sum=sum*(__gcd(a,b))*(__gcd(b,c))*(__gcd(a,c));
cout<<a*b*c/sum;
return 0;
}
分数减法
这样的分式运算我们都会。请编程计算两个分数相减的结果。
输入格式
第一行 2 个整数 a 和 b,表示一个分数(a/b)<=a<b <=10000。
第二行 2 个整数 c 和 d,表示一个分数,(d/c)<=c<d <=10000。
输入数据保证计算结果为正。
输出格式
2 个整数,表示结果。
提示:运算结果分式要约分。
输入/输出例子1
输入:
4 7
1 3
输出:
5 21
代码:
#include<bits/stdc++.h>
using namespace std;
int a,b,c,d,fm,fz;
int main(){
cin>>a>>b>>c>>d;
fm=b*d,fz=a*d-b*c;
cout<<fz/__gcd(fm,fz)<<" "<<fm/__gcd(fm,fz);
return 0;
}
桐桐的研究
在第一节桐桐已经接触过因数(子),其实也就是约数:对于一个自然数N,如果存在一个非0的正整数d(d<=N),使得N mod d=0,则d是N的约数。N=1时,约数只有一个为1,当N>1时,要分两种情况:若N为质数,则其约数只有2个,即1和它本身;若N为非质数,则其约数个数肯定大于2个。我们称N的所有约数中最大的那个为N的最大约数。
桐桐对两个自然数N和M的公约数发生了兴趣,例如:N=8,M=36,它们的公约数有:1,2,4,其中最大的那个公约数4称为这两个自然数的最大公约数。同时,两个自然数N和M的公倍数也引起了桐桐的兴趣。公倍数的概念与公约数类似,例如,N=8,M=36,它们的公倍数有:72,144,216…,有无限多个,其中72是最小的公倍数,称为这两个自然数的最小公倍数。
请你编写程序帮助桐桐求两个自然数的最大公约数和最小公倍数。
输入格式
只有一行,为两个自然数m,n(m≤10^8,n≤10^8),用空格隔开
输出格式
共两行,第一行为最大公约数,第二行为最小公倍数。
输入/输出例子1
输入:
10 15
输出:
5
30
代码:
#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main(){
cin>>a>>b;
cout<<__gcd(a,b)<<"\n"<<a*b/__gcd(a,b);
return 0;
}
面积
A型砖是红色正方形,B型砖是黄色正方形,边长不一定相等。学校想使用这2种地砖在运动场两端各铺设一个正方形的标志。一块标志方块全是红色的,另一块标志方块全是黄色的,两块标志面积要一样大小。由于地砖切割机坏了,地砖只能整块的使用,标志方块可能很大。为了节省费用,老师要求晨晨通过编计算机程序来计算标志最小的边长是多少?
输入格式
一行:2个整数A和B。分别表示边长。(2数均为大于0小于20000000的整数)
输出格式
一行:一个整数表示答案的边长。
输入/输出例子1
输入:
4 6
输出:
12
代码:
#include<bits/stdc++.h>
using namespace std;
long long a,b;
int main(){
cin>>a>>b;
cout<<a*b/__gcd(a,b);
return 0;
}
前面几道题都是关于公倍公约的,下面开始涉及到循环了
打印方阵
下面这样的方阵很有规律,称为蛇形方阵。例如 3*3 的:
1 2 3
6 5 4
7 8 9
现在给定边长,输出相应的蛇形方阵。
输入格式
1 个整数 n,表示要输出 n*n 的蛇形方阵,1<=n <=100。
输出格式
n 行,每行 n 个整数,空格隔开。
输入/输出例子1
输入:
4
输出:
1 2 3 4
8 7 6 5
9 10 11 12
16 15 14 13
代码:
#include<bits/stdc++.h>
using namespace std;
int n,sum=1;
int main(){
cin>>n;
for(int i=0;i<n;i++)
{
if(i%2==0)
{
for(int j=0;j<n;j++,sum++)
cout<<sum<<" ";
sum=sum+n-1;
cout<<"\n";
}
if(i%2==1)
{
for(int j=0;j<n;j++,sum--)
cout<<sum<<" ";
sum=sum+n+1;
cout<<"\n";
}
}
return 0;
}
字母表
Limak 是只想学习英语字母的小熊。他试图按照字母表顺序从'a'一直读到'z'。你的工作是阻止他犯错,一旦他犯错,你立刻让他停止。你能检查他正确说了多少个首字母吗?
输入格式
一个字符串 S,全部由小写英文字母构成,长度不超过 26。
输出格式
一个整数,表示 Limak 在停止前正确说出的英文字母个数。
输入/输出例子1
输入:
abctyf
输出:
3
样例解释
代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int sum,j=0;
int main(){
cin>>s;
for(char i='a';j<s.size();i++,j++)
{
if(s[j]==i)
sum++;
else break;
}
cout<<sum;
return 0;
}
JB机器人移动
在二维平面坐标系上,有一个机器人从原点 (0, 0) 开始。给出它的移动顺序,判断这个机器人在完成移动结束后的坐标。
移动顺序由字符串表示。字符 move[i] 表示其第 i 次移动。机器人的有效动作有 R(右),L(左),U(上)和 D(下)。
注意:机器人“面朝”的方向无关紧要。 “R” 将始终使机器人向右移动一次,“L” 将始终向左移动等。此外,假设每次移动机器人的移动幅度相同。
输入格式
第1行:1个字符串,不超过1000。
输出格式
一行2个整数,表示横坐标和纵坐标。
输入/输出例子1
输入:
UD
输出:
0 0
解释:机器人向上移动一次,然后向下移动一次。所有动作都具有相同的幅度,因此它最终回到它开始的原点。
输入/输出例子2
输入:
LLU
输出:
-2 1
解释:机器人向左移动两次。它最终位于原点的左侧,距原点有两次 “移动” 的距离。
代码:
#include<bits/stdc++.h>
using namespace std;
int x,y;
string s;
int main(){
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='L')x--;
if(s[i]=='R')x++;
if(s[i]=='U')y++;
if(s[i]=='D')y--;
}
cout<<x<<" "<<y;
return 0;
}
上课时间
现在,小学实行双休日(好幸福!)。
以前,周六的上午也是要上课滴:周一到周五上午四节课,下午两节课;周六上午还要上 4 节课,下午才开始休息。
已知每节课 40 分钟。
给你 n,请你从周一开始算起,n 天的上课时间是多少分钟?
输入格式
输入共一行,一个正整数 n,表示天数。
输出格式
输出共一行,包含一个正整数,表示总上课时间t。
输入/输出例子1
输入:
9
输出:
1840
样例解释
9天包括:
完整的1周:5×6+4=34节课;下一个周一周二:2×6=12节课。
共(34+12)×40=1840分钟。
数据范围
对于40%的数据:n<=30000;
对于80%的数据:n<=2000000000;
对于100%的数据:n<=1000000000000000000。
代码:
#include<bits/stdc++.h>
using namespace std;
long long n,ans;
int main(){
cin>>n;
ans=n/7*34;
for(int i=1;i<=n%7;i++)
{
if(i>=1&&i<=5)ans+=6;
else ans+=4;
}
cout<<ans*40;
return 0;
}
下面几道题有一点难度
冬眠
麻雀帕西和青蛙弗洛格是好玩伴,它们经常一起比赛唱歌。但冬天来了,青蛙弗洛格冬眠了,它的睡眠深度是 D。麻雀帕西觉得好无聊,于是它想办法要唤醒弗洛格。麻雀帕西只会唱 N 首歌,第 i 首歌的音量是 Si。每听完一首歌,青蛙弗洛格的睡眠深度就会减少,减少的值等于它听到的歌的音量。当青蛙弗洛格的睡眠深度大于 0 的时候,它会继续冬眠,当睡眠深度小于或者等于 0 时,它就会被唤醒了。麻雀帕西会从第 1 首歌开始唱,唱完第1 首歌后如果弗洛格还没醒就接着唱第 2 首歌,如果唱完第 2 首歌弗洛格还没醒就接着唱第 3 首歌,依次类推,如果唱完第 N 首歌后弗洛格还没醒,那么麻雀帕西又重新从第 1 首歌开始唱,就像循环播放音乐一样,一直到青蛙弗洛格被唤醒为止,那么麻雀帕西总共唱了多少首歌?
输入格式
第一行,两个整数: D 和 N。
第二行,N 个整数,空格分开,第 i 个整数就是第 i 首歌的音量 Si。
输出格式
一个整数,麻雀帕西总共唱了多少首歌后,弗洛格会被唤醒?
输入/输出例子1
输入:
13 3
5 2 4
输出:
4
数据范围
对 80%的数据,1 ≤ D ≤ 10000,1 ≤ N ≤ 50,1 ≤ Si ≤ 100。
另外 20%的数据,1 ≤ D ≤ 2000000000,1 ≤ N ≤ 50,1 ≤ Si ≤ 3。
样例解释
代码:
#include<bits/stdc++.h>
using namespace std;
long long k,n,s[55],ans,sum,x,y;
int main(){
cin>>k>>n;
for(int i=1;i<=n;i++)
{
cin>>s[i];
ans+=s[i];
}
x=k/ans,k=y=k%ans;
sum=sum+n*x;
if(y!=0)
{
for(int i=1;i<=n;i++)
{
k=k-s[i],sum++;
if(k<=0){cout<<sum;return 0;}
}
}
cout<<sum;
return 0;
}
新型机器人
有一新型机器人可以按照输入的命令进行移动,命令包含’E’、’S’、’W’、’N’四种,分别对应四个不同的方向,依次为东、南、西、北。执行某个命令时,它会向着对应方向移动一个单位。作为新型机器人,自然不会只单单执行一个命令,它可以执行命令串。对于输入的命令串,每一秒它会按照命令行动一次。而执行完命令串最后一个命令后,会自动从头开始循环。在0时刻桐桐将机器人放置在了(0,0)的位置,并且输入了命令串。她想要知道T秒后机器人所在的位置坐标。
向东移动,坐标改变改变为(X+1,Y);
向南移动,坐标改变改变为(X,Y-1);
向西移动,坐标改变改变为(X-1,Y);
向北移动,坐标改变改变为(X,Y+1);
输入格式
第1行:一个字符串,表示桐桐输入的命令串,保证至少有1个命令(命令的长度<=10^6)
第2行:一个正整数T(T<=2^31)
输出格式
第1行:两个整数,表示T秒时,机器人的坐标。
输入/输出例子1
输入:
NSWWNSNEEWN
12
输出:
-1 3
代码:
#include<bits/stdc++.h>
using namespace std;
int x,y,z,t;
string s;
int main(){
cin>>s>>t;
z=s.size();
for(int i=0;i<z;i++)
{
if(s[i]=='E')x++;
if(s[i]=='S')y--;
if(s[i]=='W')x--;
if(s[i]=='N')y++;
}
int p=t/z,q=t%z;
x*=p,y*=p;
t=q;
for(int i=0;i<t;i++)
{
if(s[i]=='E')x++;
if(s[i]=='S')y--;
if(s[i]=='W')x--;
if(s[i]=='N')y++;
}
cout<<x<<" "<<y;
return 0;
}
旋转操作
把字符串旋转一次操作等价于把字符串的最后一个字符跑到在前面,例如:"abcdefg" ---旋转一次---"gabcdef"。现在输入一个字符串 s,还有 N 个旋转操作。每个操作有 3 个参数:s , t, c,意思是要你把开始位置是 s,结束位置是 t 的这段字符串旋转 c 次。例如:字符串"abcdefg",经过操作(2,5,2)后变为"abefcdg"。注意:字符串从0开始。
输入格式
第 1 行:包含空格的字符串 s,长度不超过 1000 ;
第 2 行:一个整数 N,表示下面有 N 个旋转操作度 (1<=N<= 1000);
第 3 行到第 N+3 行:每行 3 个整数:s,t,c。保证 0<=s<=t<s 的长度;0<=c<10000;
输出格式
输出只有 1 行,将 s 依次 N 次旋转操作后的字符串。
输入/输出例子1
输入:
Youwantsomeonetohelpyou
3
1 5 100
0 3 20
2 15 60
输出:
Yonetouwantsomeohelpyou
样例解释
第一次旋转后的结果是:Youwantsomeonetohelpyou
第二次旋转后的结果是:Youwantsomeonetohelpyou
第三次旋转后的结果是:Yonetouwantsomeohelpyou
其中,第三次旋转,就是把子字符串“uwantsomeoneto“”旋转60次。
提示
该字符串可能有空格
代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int t,a,b,c;
int main(){
getline(cin,s);
cin>>t;
while(t--)
{
cin>>a>>b>>c;
for(int i=1;i<=c%(b-a+1);i++)
{
char x=s[b];
for(int j=b;j>a;j--)
s[j]=s[j-1];
s[a]=x;
}
}
cout<<s<<endl;
return 0;
}
手机号码
奶牛Bessie最近买了一台手机,它的手机号码是:13300303003,手机号码由11个数字组成。Bessie最近在上电脑课学了【复制】和【粘贴】,于是它打开word软件,把它的手机号码复制,然后粘贴了N次。例如N=1时,是这样:13300303003 。又例如N=2时,是这样:1330030300313300303003。 再例如N=3时,是这样:133003030031330030300313300303003。 如果N=4,会是这样:13300303003133003030031330030300313300303003。 现在给出了三个正整数:N,S,T。表示奶牛Bessie把它的手机号码复制粘贴了N次,然后奶牛要计算:第S个数字到第T个数字之间,有多少个数字3(包含第S个数字和第T个数字)?由于奶牛Bessie复制粘贴N次手机号码后已经眼花了,所以它希望你能写个程序来帮它计算,你能做到吗?
输入格式
一行,三个正整数: N,S,T
输出格式
一个整数,表示Bessie把手机号码复制粘贴N次后,第S个数字到第T个数字之间包含了多少个数字3(包含第S个数字和第T个数字)。
输入/输出例子1
输入:
1 2 11
输出:
5
样例解释
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a,b,sum;
string s="13300303003";
int main(){
cin>>n>>a>>b;
b--,a--;
sum+=(b/11-a/11-1)*5;
if(a/11!=b/11)
{
for(int i=a%11;i<s.size();i++)
if(s[i]=='3')sum++;
for(int i=0;i<=b%11;i++)
if(s[i]=='3')sum++;
}
else
{
for(int i=a/11;i<=b/11;i++)
if(s[i]=='3')sum++;
}
cout<<sum;
return 0;
}
移动次数最少
有n堆糖果(2≤n≤200),排成一行,编号分别为1,2,…n。已知每堆糖果有一定的颗数,且颗数之和均为n的倍数。移动各堆中的任意颗糖果,使每堆的数量达到相同,且移动次数最少。
移动规则:每次可以移动任意的糖果颗数,第1堆可以移向第2堆,第2堆可以移向第1堆或第3堆,。。。。。。 第n 堆只可以移向第n -1堆。
例如,当n=4时:
堆号 1 2 3 4
颗数 9 8 17 6
移动的方法有许多种, 其中的一种方案:
① 第3堆向第4堆移动4颗,成为:9 8 13 10
② 第3堆向第2堆移动3颗,成为:9 11 10 10
③ 第2堆向第1堆移动1颗,成为:10 10 10 10
经过三次移动,每堆都成为10颗。
输入格式
两行。 第一行一个整数n。第二行n个整数,用空格分隔。
输出格式
一个整数(表示最少移动次数)。
输入/输出例子1
输入:
4
9 8 17 6
输出:
3
代码:
#include<bits/stdc++.h>
using namespace std;
int s[205],h,n,c,z,k,ans,a[205];
int main() {
cin>>n;
for(int i=0;i<n;i++)
{
cin>>a[i];
h+=a[i];
s[i]=h;
}
k=n-1,c=h/n,z=k-1;
while(z!=-1)
{
if(a[k]==c)
{
k--,z--;
continue;
}
int x=(z+1)*c-s[z];
a[k]-=x,a[z]+=x;
k=z,z--;
ans++;
}
cout<<ans<<endl;
return 0;
}
恢复数组
有一个数组a[1..n],但是这个数组的内容丢失了,你要尝试恢复它。已知以下的三个事实:
1、对于1<=i<=n,都有a[i]>0,且所有的a[i]互不相同。即a数组保存的全部都是正整数,且互不相同。
2、x和y一定是属于数组a,且x<y。
3、a数组是递增的数组,且相邻两项的差是相等的。即数组a是等差数列。
容易发现,同时满足上面三个条件的a数组不一定是唯一的。你要输出使得a[n]的值最小的那个a数组,如果还不唯一,输出使得a[1]的值最小的那个a数组。
输入格式
多组测试数据。
第一行,一个整数T,表示有T组测试数据。1<=T<=100。
接下来有T行,每行3个整数:n,x,y。2<=n<=50。1<=x,y<=50。
输出格式
共T行,每行n个整数。
输入/输出例子1
输入:
5
2 1 49
5 20 50
6 20 50
5 3 8
9 13 22
输出:
1 49
10 20 30 40 50
20 26 32 38 44 50
3 8 13 18 23
1 4 7 10 13 16 19 22 25
代码:
#include<bits/stdc++.h>
using namespace std;
int t;
int main(){
cin>>t;
while(t--)
{
int n,x,y,minn=100000000,minj=0,mini=0;
cin>>n>>x>>y;
for(int i=1;i<=x;i++)
{
for(int j=1;j<=y-x;j++)
{
int sum=i,bj=0,cj=0;
for(int z=1;z<=n;z++)
{
if(sum==x)bj=1;
if(sum==y)cj=1;
if(bj&&cj)break;
sum+=j;
}
if(!bj||!cj)continue;
sum=i+(n-1)*j;
if(minn>sum)minn=sum,minj=j,mini=i;
}
}
for(int i=mini;i<=minn;i+=minj)
cout<<i<<" ";
cout<<endl;
}
return 0;
}
零花钱
小明把过去n天里每天使用的零花钱记录了下来,他认为对于一段时间(第s天至第t天)里,如果第(s+1)天至第(t-1)天中每天的花费都不高于第s天和第t天的花费,那么这段时间里他的花费是合理的。
给出s和t,如果这段时间的花费是合理的,则输出“yes”,否则输出“no”。
输入格式
第一行一个整数n(1≤n≤50000),表示n天。
第二行n个整数ai(0≤ai≤500),表示每天的花费。
第三行一个整数m(1≤m≤50000),表示m次询问。
接下来m行,每行两个数s,t(1≤s<t≤50000),且保证s至t之间至少相隔一天。
输出格式
输出m行,表示对应每一询问的答案。
输入/输出例子1
输入:
7
4 3 1 2 3 5 7
3
1 4
2 5
2 6
输出:
no
yes
yes
样例解释
第一个询问,第2个数比第4个数大,所以不合理。
第二个询问,第3、4个数都比第2、5个数小,所以合理。
第三个询问,第3、4、5个数都不大于第2个数和第6个数,所以合理。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[10000005],m,b[50005][505];
int x,y;
int main(){
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>a[i];
for(int j=0;j<=500;j++)
b[i][j]=b[i-1][j];
b[i][a[i]]++;
}
cin>>m;
while(m--)
{
cin>>x>>y;
int f=min(a[x],a[y])+1,sum=0;
for(int i=f;i<=500;i++)
sum=sum+b[y-1][i]-b[x][i];
if(sum==0)cout<<"yes\n";
else cout<<"no\n";
}
return 0;
}
填志愿
现有 m(m≤100000) 所学校,每所学校预计分数线是 ai(ai≤10^6)。有 n(n≤100000) 位学生,估分分别为bi(bi≤10^6)。
根据 n 位学生的估分情况,分别给每位学生推荐一所学校,要求学校的预计分数线和学生的估分相差最小(可高可低,毕竟是估分嘛),这个最小值为不满意度。求所有学生不满意度和的最小值
输入格式
第一行读入两个整数 m,n。m 表示学校数,n 表示学生数。
第二行共有 m 个数,表示 m 个学校的预计录取分数。
第三行有 n 个数,表示 n 个学生的估分成绩
输出格式
输出一行,为最小的不满度之和
输入/输出例子1
输入:
4 3
513 598 567 689
500 600 550
输出:
32
代码:
#include<bits/stdc++.h>
using namespace std;
const int N=1e6+200;
int a[N],b[N],n,m;
int main()
{
cin>>n>>m;
for(int i=0;i<n;i++)
cin>>a[i];
for(int i=0;i<m;i++)
cin>>b[i];
sort(a,a+n);
int ans=0;
for(int i=0;i<m;i++)
{
int l=0,r=n-1;
while(l<r)
{
int mid=l+((r-l)>>1);
if(a[mid]<=b[i])l=mid+1;
else r=mid;
}
if(b[i]<=a[0]){
ans+=a[0]-b[i];
}
else{
ans+=min(abs(a[l-1]-b[i]),abs(a[l]-b[i]));
}
}
cout<<ans;
return 0;
}
质因数
小明的老师在信息学课堂上讲了有关分解质因数的知识。例如12可以分解质因数:12=2×2×3,60=2×2×3×5等等。小明发现,有些数字分解出来的质因数的个数也是该数字的质因数,例如12分解出来的质因数有3个,3是12的质因数;60分解出来的质因数有4个,但4不是60的质因数。他觉得很有趣,想求出不大于n的所有这样的数字。你能帮帮他吗?
输入格式
一行,一个整数n。
输出格式
若干行,每行一个数,要求按照从小到大的顺序输出。
输入/输出例子1
输入:
12
输出:
4
6
10
12
样例解释
样例1中,4可以分解2个质因数,2是4的质因数;6可以分解2个质因数,2是6的质因数;10可以分解2个质因数,2是10的质因数;12可以分解3个质因数,3是12的质因数。
数据范围
对于50%的数据,2≤n≤1000;
对于80%的数据,2≤n≤10000;
对于100%的数据,2≤n≤100000。
代码:
#include<bits/stdc++.h>
using namespace std;
int n,a[100001],b[100001],c;
void zs()
{
for(int i=2;i<=100000;i++)
{
if(a[i]==0)
{
b[++c]=i;
for(int j=i+i;j<=100000;j+=i)
a[j]=1;
}
}
}
bool zys(int t)
{
int len=0,x=t;
for(int i=1;i<c;i++)
{
while(t%b[i]==0)
{
len++;
t=t/b[i];
}
if(t==1)break;
}
if(len==0)return false;
if(x%len==0&&a[len]==0&&len!=1)
{
return true;
}
return false;
}
int main(){
zs();
cin>>n;
for(int i=2;i<=n;i++)
{
if(zys(i))
{
cout<<i<<endl;
}
}
return 0;
}
菜鸟整理的一些题,大佬不喜勿喷......