OJ算法题共10个篇幅,不定期在篇幅里增加题目(篇幅不增加)。
个人水平有限,如有错误和可以改进的地方,非常期待批评指正,谢谢!
题目描述
Last_Day买了很多猫粮。 猫粮跟狗粮有很大区别。 狗粮是长这样的:
#
###
#####
猫粮是长这样的
A
ABA
ABCBA
ABCDCBA
ABCDEDCBA
ABCDCBA
ABCBA
ABA
A
请你帮Last_Day摆放猫粮。 (请不要好奇为什么Last_Day要买猫粮,他最近收养了一只吃东西比较奇怪的羚羊而已。)
输入
输入多组数据。 每组数据只有一行,为一个正整数n(n为奇数且不超过51)。
输出
输出对应菱形,见样例。
输入样例
1
3
输出样例
A
A
ABA
A
#include<iostream>
#include<cstring>
using namespace std;
int main(){
string a="XABCDEFGHIJKLMNOPQRSTUVWXYZ";
int n;
while (cin>>n){
int i;
for(i=1;i<=(n+1)/2;i++){
int counter;
for(counter=1;counter<=(n+1)/2;counter++){
if(counter<=(n+1)/2-i||counter>=(n+1)/2+i){
cout<<" ";
}
else{
cout<<a[counter+i-(n+1)/2];
}
}
counter=counter-2;
for(;counter>0;counter--){
if(counter<=(n+1)/2-i||counter>=(n+1)/2+i){
cout<<" ";
}
else{
cout<<a[counter+i-(n+1)/2];
}
}
cout<<endl;
}
i=i-2;
for(;i>0;i--){
int counter;
for(counter=1;counter<=(n+1)/2;counter++){
if(counter<=(n+1)/2-i||counter>=(n+1)/2+i){
cout<<" ";
}
else{
cout<<a[counter+i-(n+1)/2];
}
}
counter=counter-2;
for(;counter>0;counter--){
if(counter<=(n+1)/2-i||counter>=(n+1)/2+i){
cout<<" ";
}
else{
cout<<a[counter+i-(n+1)/2];
}
}
cout<<endl;
}
}
return 0;
}
题目描述
西沙水下,一阵暗流,Thor与天真一行人被冲散了。
幸运的是,他被冲到了一扇门前。
不幸的是,刚刚到达这扇门前,门就合上了。上面的机关被重置为初始态。
经过仔细的观察,Thor发现,机关为一个圆盘,分为内外两圈。内圈均匀刻着a个小格,外圈均匀刻着b个小格,每个刻度有一个独一无二的图腾与之对应。
他还发现,每经过一分钟,内外两圈会同时顺时针旋转一个单位。从身边墙壁上的铭文,他得知,当轮盘再次回到初始状态时,门会重新打开。他想知道从门被合上到再次打开的这一个轮回需要多少时间,这个任务就交给你了。
输入
多组测试数据。 对于每组测试数据,输入两个数a,b(1≤a,b≤30000),用空格隔开,具体含义见题目描述。
输出
对于每组数据,输出一行,包含一个整数,表示一个轮回需要的时间。
输入样例
3 4
4 8
12 16
输出样例
12
8
48
Hint
机关的话,大概就是这个样子咯
//最小公倍数=两数乘积/最大公约数
#include<stdio.h>
int mian(){
int a,b,c;
while(scanf("%d%d",&a,&b)!=EOF){
int m=a*b;
if(a<b){
int temp=b;
b=a;
a=temp;
}
while(b!=0){
c=a%b;
a=b;
b=c;
}
printf("%d\n",m/a);
}
return 0;
}
计算A+B
输入
第一个数为数据组数n a1,a2
接下来n行,每行2个整数a,b(保证a,b, a+b在int范围内)
输出
对于每组数据,输出一行,a+b的值
输入样例
1
1 2
输出样例
3
#include<stdio.h>
int main()
{
int n,a,b;
scanf("%d",&n);
while(n--){
scanf("%d%d",&a,&b);
printf("%d\n",a+b);
}
return 0;
}
题目描述
这是一个古老而无聊的游戏,这是一个欧几里得躺枪的游戏。
Nova君和LaoWang决定一分胜负。给定两个正整数a,b。
Nova君和LaoWang轮流从中将较大的数字减去较小数字的整数倍(1倍,2倍等等)。
并且保证每次减完不会出现负数的情况。由Nova君先手。
最终在自己回合将其中一个数变为0的一放获胜。两个人智商都还行,都会采取最优策略,谁会赢呢?
输入
多组测试数据。对于每组测试数据,给出两个数字a和b(保证Int范围内)
输出
对于每组数据,输出获胜者的名字。
输入样例
34 12
15 24
输出样例
Nova
LaoWang
#include<stdio.h>
#include<stdlib.h>
void swap(int *a,int *b){
int temp;
temp=*a;
*a=*b;
*b=temp;
}
int main(){
int a,b;
while((scanf("%d%d",&a,&b))!=EOF){
int c=2;
while(a!=0&&b!=0){
if(a>b){
swap(&a,&b);
}
b=b-a;
c++;
if(b==0)break;
}
if(c%2==0){
printf("Nova\n");
}
else
printf("LaoWang\n");
}
return 0;
}
题目描述
不打麻将的零崎特别的无聊,所以他又四处乱逛了。
四处乱逛的无聊零崎遇到了另一个特别无聊的人,
因为这个人竟然在无聊的算各种一元n次多项式a0+a1x+a2x^2+……+anx^n!
这个无聊的人算的实在太慢了令零崎忍不住想开启嘲讽模式,
所以现在,快来给零崎搞一个能快速计算多项式的东西吧。(其实可能也不用特别快
输入
多组输入数据。 每组数据以多项式次数n开始,下一个数字为变量x,之后n+1个数字为系数a0……an。输入数据保证在int范围内
输出
每行一个结果,也许n特别大所以最后结果还是对1e6+7求模吧……
输入样例
1 2 1 2
3 2 1 2 3 4
输出样例
5
49
#include <stdio.h>
int A[1000000];
int div = 1000007;
int main()
{
int n, x, sum;
while (scanf("%d%d", &n, &x) != EOF)
{
for (int i = 0; i <= n; i++)
scanf("%d", &A[i]);
sum = 0;
for (int i = n; i > 0; i--)
sum = (sum + A[i])*x%div;
printf("%d\n", (sum + A[0]) % div);
}
}
题目描述
输入一个正整数n,随后给出一个长度为n的整数序列a1,a2,a3...an。求给定序列的逆序数。
概念回顾:
逆序对:数列a[1],a[2],a[3]…中的任意两个数a[i],aj,如果a[i]>a[j],那么我们就说这两个数构成了一个逆序对。
逆序数:一个数列中逆序对的总数。
输入
多组测试数据。对于每组测试数据,给出序列长度n,和一个长度为n的序列a1,a2,a3...an
(0<n<=10^6,保证ai在int范围内)
输出
对于每组数据,输出该序列的逆序数。
输入样例
7
3 5 4 8 2 6 9
输出样例
6
Hint
1、用n^2的算法是不行不行滴╮(╯_╰)╭
2、分治法
#include<stdio.h>
int A[1000000];
int B[1000000];
int main(){
int n,number=0;
while(scanf("%d",&n)!=EOF){
for(int i=0;i<n;i++){
scanf("%d",&A[i]);
for(int j=0;j<i;j++){
if(A[i]<A[j])
number++;
}
}
printf("%d\n",number);
}
return 0;
}