OJ算法可运行④

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范围内)

输出
对于每组数据,输出该序列的逆序数。

输入样例

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;
}

上一篇

下一篇

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

磊磊cpp

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值