试题 算法训练 数组移动
资源限制
时间限制:1.0s 内存限制:256.0MB
问题描述
初始数组A[N]中为1,2,..,N,N个数字,现要进行M次操作,每次操作给定一个数字i,记其在数组中的位置为Bi,将A[1]..A[Bi]移到数组末尾。
输入格式
输入的第一行包含两个整数N,M。接下来M行,每行一个正整数,表示给定的数字i。
输出格式
一行,输出M次操作后的A数组。
样例输入
5 2
3
2
样例输出
3 4 5 1 2
样例说明
第一次操作后变为 4 5 1 2 3
第二次操作后变为 3 4 5 1 2
数据规模和约定
N<=10^5,M<=10^5
思路:和昨天写的那道差不多,就是找到最后一个要找的数的下标,然后先输出后半部分,在输出前半部分。
#include <iostream>
#include <algorithm>
#include <functional>
#include <iomanip>
#include <string>
using namespace std;
int main()
{
int j,i,t,n,m,x,k;
cin>>n;
int a[n];
for(i=0;i<n;i++)
a[i]=i+1;
cin>>m;
while(m--)
{
cin>>j;
for(i=0;i<n;i++)
if(a[i]==j)
x=i;
}
for(i=x+1;i<n;i++)
cout<<a[i]<<' ';
for(i=0;i<x;i++)
cout<<a[i]<<' ';
cout<<a[x];
return 0;
}
链接:登录—专业IT笔试面试备考平台_牛客网
来源:牛客网
题目描述
算法协会有三个主要部门,算法组、项目组和事务组。现在指导老师CD想为大家发福利,给每个组发若干瓶肥宅快乐水,要求各组得到的肥宅快乐水数量相同,并且各组内能够按人数平分(每人至少分一瓶)。现在Reverie统计了三个组的人数,你能帮CD老师算一下至少要准备多少瓶肥宅快乐水吗?
输入描述:
一行内给出三个正整数a,b,c(1≤a,b,c≤1000)a,b,c(1\leq a,b,c\leq1000)a,b,c(1≤a,b,c≤1000), 表示三个组的人数。
输出描述:
一行内输出一个正整数,表示CD老师要准备肥宅快乐水的最少瓶数。
示例1
输入
复制2 4 5
2 4 5
输出
复制60
60
思路:这题求的是三个数的最小公倍数再乘三
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int locp(int a,int b)//求最大公约数
{
int c;
while(1)
{
if(a>b)
{
c=a-b;
a=b;
b=c;
}
else
{
c=b-a;
b=a;
a=c;
}
if(c==0)
break;
}
return a=a>b?a:b;
}
int main()
{
int a,b,c,n,m,l;
cin>>a>>b>>c;
m=locp(a,b);
m=a*b/m;//求最小公倍数
l=locp(m,c);
n=m*c/l;
n*=3;
cout<<n;
return 0;
}
试题 算法训练 P0704
资源限制
时间限制:1.0s 内存限制:256.0MB
一个数如果从左往右读和从右往左读数字是完全相同的,则称这个数为回文数,比如898,1221,15651都是回文数。编写一个程序,输入两个整数min和max,然后对于min~max之间的每一个整数(包括min和max),如果它既是一个回文数又是一个质数,那么就把它打印出来。要求,回文数和质数的判断都必要要用函数的形式来实现。
输入:
5 100
输出:
5 7 11
思路:这题还是比较简单的,主要就是1,要单独考虑一下
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int zhishu(int m)//判断质数的函数
{
if(m==1)//1不是质数
return 0;
int i,f=0;
for(i=2;i<=sqrt(m);i++)
if(m%i==0)
{f=1;break;}
if(f==0)
return m;
else
return 0;
}
int huiwen(int n)//判断回文数
{
int a,b=0;
a=n;
while(a)
{
b=b*10+a%10;
a/=10;
}
if(n==b)
a=zhishu(n);
else
a=0;
return a;
}
int main()
{
int n,m,i;
cin>>n>>m;
for(i=n;i<=m;i++)
{
if(huiwen(i))
cout<<i<<' ';
}
return 0;
}
试题 基础练习 Sine之舞
资源限制
时间限制:1.0s 内存限制:512.0MB
问题描述
最近FJ为他的奶牛们开设了数学分析课,FJ知道若要学好这门课,必须有一个好的三角函数基本功。所以他准备和奶牛们做一个“Sine之舞”的游戏,寓教于乐,提高奶牛们的计算能力。
不妨设
An=sin(1–sin(2+sin(3–sin(4+...sin(n))...)
Sn=(...(A1+n)A2+n-1)A3+...+2)An+1
FJ想让奶牛们计算Sn的值,请你帮助FJ打印出Sn的完整表达式,以方便奶牛们做题。
输入格式
仅有一个数:N<201。
输出格式
请输出相应的表达式Sn,以一个换行符结束。输出中不得含有多余的空格或换行、回车符。
样例输入
3
样例输出
((sin(1)+3)sin(1–sin(2))+2)sin(1–sin(2+sin(3)))+1
思路:这题我没啥思路,看了网上的思路,就是先输出An,在输出Sn。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
void An(int n)//输出An函数
{
int i=1,j=1;
while(i<=n)
{
if(i<2)
cout<<"sin(1";
if(i>=2)
{
if(i%2==0)//偶数就进行减
cout<<"-sin("<<i;
else//奇数进行加
cout<<"+sin("<<i;
}
i++;
}
while(j<n)
{
cout<<')';
j++;
}
}
int main()
{
int n,i,m,j=1,k;
cin>>n;
m=n;
for(i=1;i<n;i++)//输出Sn
cout<<'(';
for(k=1;k<=n;k++)
{
An(k);
cout<<')';
cout<<'+'<<m;
m--;
if(m==0)
break;
cout<<')';
}
return 0;
}
试题 算法训练 P1103
资源限制
时间限制:1.0s 内存限制:256.0MB
编程实现两个复数的运算。设有两个复数 和 ,则他们的运算公式为:
要求:(1)定义一个结构体类型来描述复数。
(2)复数之间的加法、减法、乘法和除法分别用不用的函数来实现。
(3)必须使用结构体指针的方法把函数的计算结果返回。
说明:用户输入:运算符号(+,-,*,/) a b c d.
输出:a+bi,输出时不管a,b是小于0或等于0都按该格式输出,输出时a,b都保留两位。
输入:
- 2.5 3.6 1.5 4.9
输出:
1.00+-1.30i
思路:比较简单这题,只要掌握公式就行
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
double a,b,c,d,y;
void jia()
{
cin>>a>>b>>c>>d;
a=a+c;
b=b+d;
printf("%.2lf+%.2lfi",a,b);
return;
}
void jian()
{
cin>>a>>b>>c>>d;
a=a-c;
b=b-d;
printf("%.2lf+%.2lfi",a,b);
return;
}
void cheng()
{
cin>>a>>b>>c>>d;
y=a;
a=a*c-b*d;
b=b*c+y*d;
printf("%.2lf+%.2lfi",a,b);
return;
}
void chu()
{
cin>>a>>b>>c>>d;
y=a;
a=(a*c+b*d)/(c*c+d*d);
b=(b*c-y*d)/(c*c+d*d);
printf("%.2lf+%.2lfi",a,b);
return;
}
int main()
{
char x;
cin>>x;
if(x=='-')
jian();
if(x=='+')
jia();
if(x=='/')
chu();
if(x=='*')
cheng();
return 0;
}
试题 算法训练 P0702
资源限制
时间限制:1.0s 内存限制:256.0MB
在C语言中,有一个strcmp函数,其功能是比较两个字符串s1和s2。请编写一个你自己的字符串比较函数my_strcmp,来实现strcmp函数的类似功能。如果s1=s2,则返回0;否则返回s1 与s2 第一个不同字符的差值(如果s1<s2,该差值是一个负数;如果s1>s2,该差值是一个正数)。编写测试程序,输入两个长度小于1000的字符串(可能包含有空格,且长度不一定相等),然后调用my_strcmp函数来进行比较,并输出返回结果。
输入:
aBcDefgf
aacdef
输出:
-31
思路:先用strcmp进行比较,如果等于0,直接输出,否则分类讨论,循环最大的字符串长度,找到第一个不一样的字符,做差输出。
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#include <algorithm>
using namespace std;
int main()
{
char a[1009],b[1009];
gets(a);
gets(b);
int n,x,y,i;
x=strlen(a);
y=strlen(b);
x=x>y?x:y;
n=strcmp(a,b);
if(n==0)
cout<<'0';
else if(n>0)
{
for(i=0;i<x;i++)
{
if(a[i]!=b[i])
{
n=a[i]-b[i];
cout<<n;
return 0;
}
}
}
else
{
for(i=0;i<x;i++)
{
if(a[i]!=b[i])
{
n=a[i]-b[i];
cout<<n;
return 0;
}
}
}
return 0;
}