NOI / 1.6编程基础之一维数组(3)

文章介绍了几个编程题目,涉及树的计数问题(移除部分树),判断有趣序列(绝对差值递增),石头剪刀布游戏策略,以及大整数的加法、减法和幂运算。
摘要由CSDN通过智能技术生成

目录

06:校门外的树

描述

07:有趣的跳跃

描述

08:石头剪刀布

描述

09:向量点积计算

描述

10:大整数加法

描述

11:大整数减法

描述

12:计算2的N次方

描述


06:校门外的树

描述

某校大门外长度为L的马路上有一排树,每两棵相邻的树之间的间隔都是1米。我们可以把马路看成一个数轴,马路的一端在数轴0的位置,另一端在L的位置;数轴上的每个整数点,即0,1,2,……,L,都种有一棵树。

由于马路上有一些区域要用来建地铁。这些区域用它们在数轴上的起始点和终止点表示。已知任一区域的起始点和终止点的坐标都是整数,区域之间可能有重合的部分。现在要把这些区域中的树(包括区域端点处的两棵树)移走。你的任务是计算将这些树都移走后,马路上还有多少棵树。

输入

第一行有两个整数L(1 <= L <= 10000)和 M(1 <= M <= 100),L代表马路的长度,M代表区域的数目,L和M之间用一个空格隔开。接下来的M行每行包含两个不同的整数,用一个空格隔开,表示一个区域的起始点和终止点的坐标。

对于20%的数据,区域之间没有重合的部分;
对于其它的数据,区域之间有重合的情况。

输出

包括一行,这一行只包含一个整数,表示马路上剩余的树的数目。

样例输入

500 3
150 300
100 200
470 471
样例输出

298

#include <iostream>
#include<string.h>
using namespace std;
int a[10005],L,M,l,r,sum;
int main()
{
        cin>>L>>M;
        for(int i=0;i<M;i++)
        {
            cin>>l>>r; 
            for(int j=l;j<=r;j++)
            {
                a[j]=1;
            }
        }
        for(int i=0;i<=L;i++)
        {
            if(a[i]==0) sum++;
        }
        cout<<sum;
    return 0;
}

07:有趣的跳跃

描述

一个长度为n(n>0)的序列中存在“有趣的跳跃”当前仅当相邻元素的差的绝对值经过排序后正好是从1到(n-1)。例如,1 4 2 3存在“有趣的跳跃”,因为差的绝对值分别为3,2,1。当然,任何只包含单个元素的序列一定存在“有趣的跳跃”。你需要写一个程序判定给定序列是否存在“有趣的跳跃”。

输入

一行,第一个数是n(0 < n < 3000),为序列长度,接下来有n个整数,依次为序列中各元素,各元素的绝对值均不超过1,000,000,000。

输出

一行,若该序列存在“有趣的跳跃”,输出"Jolly",否则输出"Not jolly"。

样例输入

4 1 4 2 3
样例输出

Jolly

#include <iostream>
#include<string.h>
using namespace std;
int a[3005],b[3005],n;
int main()
{
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n-1;i++)
        {
            b[i]=abs(a[i]-a[i+1]);        
        }
        for(int i=1;i<n;i++)
        {
            if(b[i]!=i)
            {
                cout<<"Not jolly";
                return 0;
            }                
        }
        cout<<"Jolly";
    return 0;
}

08:石头剪刀布

描述

石头剪刀布是常见的猜拳游戏。石头胜剪刀,剪刀胜布,布胜石头。如果两个人出拳一样,则不分胜负。

一天,小A和小B正好在玩石头剪刀布。已知他们的出拳都是有周期性规律的,比如:“石头-布-石头-剪刀-石头-布-石头-剪刀……”,就是以“石头-布-石头-剪刀”为周期不断循环的。请问,小A和小B比了N轮之后,谁赢的轮数多?

输入

输入包含三行。
第一行包含三个整数:N,NA,NB,分别表示比了N轮,小A出拳的周期长度,小B出拳的周期长度。0 < N,NA,NB < 100。
第二行包含NA个整数,表示小A出拳的规律。
第三行包含NB个整数,表示小B出拳的规律。
其中,0表示“石头”,2表示“剪刀”,5表示“布”。相邻两个整数之间用单个空格隔开。

输出

输出一行,如果小A赢的轮数多,输出A;如果小B赢的轮数多,输出B;如果两人打平,输出draw。

样例输入

10 3 4
0 2 5
0 5 0 2
样例输出

A
提示

对于测试数据,猜拳过程为:
A:0 2 5 0 2 5 0 2 5 0
B:0 5 0 2 0 5 0 2 0 5
A赢了4轮,B赢了2轮,双方打平4轮,所以A赢的轮数多。

#include <iostream>
#include<string.h>
using namespace std;
int a[105],b[105],n,na,nb,an,bn;
int main()
{
        cin>>n>>na>>nb;
        for(int i=1;i<=na;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=nb;i++)
        {
            cin>>b[i];        
        }
        int ai=1,bi=1;
        for(int i=1;i<=n;i++)
        {
            if(ai==na+1) ai=1;
            if(bi==nb+1) bi=1;
            if(a[ai]-b[bi]==-2||a[ai]-b[bi]==5||a[ai]-b[bi]==-3)
            {
                an++;
            }else if(a[ai]-b[bi]==0)
            {
                
            }else
            {
                bn++;
            }
            ai++;
            bi++;                        
        }
        if(an>bn) cout<<"A";
        else if(bn>an) cout<<"B";
        else cout<<"draw";
    return 0;
}

09:向量点积计算

描述

在线性代数、计算几何中,向量点积是一种十分重要的运算。

给定两个n维向量a=(a1,a2,...,an)和b=(b1,b2,...,bn),求点积a·b=a1b1+a2b2+...+anbn。

输入

第一行是一个整数n。1 <= n <= 1000。
第二行包含n个整数a1,a2,...,an。
第三行包含n个整数b1,b2,...,bn。
相邻整数之间用单个空格隔开。每个整数的绝对值都不超过1000。

输出

一个整数,即两个向量的点积结果。

样例输入

3
1 4 6
2 1 5
样例输出

36

#include <iostream>
#include<string.h>
using namespace std;
int a[1005],b[1005],n,sum;
int main()
{
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>a[i];
        }
        for(int i=1;i<=n;i++)
        {
            cin>>b[i];
        }
        for(int i=1;i<=n;i++)
        {
            sum+=a[i]*b[i];
        }
        cout<<sum;
    return 0;
}

10:大整数加法

描述

求两个不超过200位的非负整数的和。

输入

有两行,每行是一个不超过200位的非负整数,可能有多余的前导0。

输出

一行,即相加后的结果。结果里不能有多余的前导0,即如果结果是342,那么就不能输出为0342。

样例输入

22222222222222222222
33333333333333333333
样例输出

55555555555555555555

11:大整数减法

描述

求两个大的正整数相减的差。

输入

共2行,第1行是被减数a,第2行是减数b(a > b)。每个大整数不超过200位,不会有多余的前导零。

输出

一行,即所求的差。

样例输入

9999999999999999999999999999999999999
9999999999999

样例输出

9999999999999999999999990000000000000
#include <iostream>
#include<string.h>
using namespace std;
char a[205],b[205];
int c[205],d[205],s[205],sum;
int main()
{
        cin>>a>>b;
        int len_a=strlen(a);
        int len_b=strlen(b);
        for(int i=0;i<len_a;i++)
        {
            c[i]=a[len_a-i-1]-'0';
        }
        for(int i=0;i<len_b;i++)
        {
            d[i]=b[len_b-i-1]-'0';
        }            
        int len_max=max(len_a,len_b);
        for(int i=0;i<len_max;i++)
        {
            sum=c[i]+d[i]+s[i];
            if(sum>=10){
                s[i]=sum-10;
                s[i+1]=1;
            }else{
                s[i]=sum;
            }
        }
        int index=len_max;
        while(s[index]==0&&index>0) index--; 
        for(int i=index;i>=0;i--)
        {
            cout<<s[i];
        }
    return 0;
}

12:计算2的N次方

描述

任意给定一个正整数N(N<=100),计算2的n次方的值。

输入

输入一个正整数N。

输出

输出2的N次方的值。

样例输入

5
样例输出
32

#include <iostream>
#include<string.h>
using namespace std;
int main()
{
	int N;
	cin >> N;
	int ans[50]; 
	ans[0] = 1; 
	int m = 1;
	int carry;
	int i;
	int j;
	for (i = 1; i <= N; i++)
	{
		carry = 0; 
		for (j = 0; j < m; j++)
		{
			ans[j] = ans[j] * 2 + carry;
			if (ans[j] > 9) 
			{
				carry = ans[j] / 10; 
				ans[j] = ans[j] % 10; 
			}
			else 
			{
				carry = 0; 
			}
		}
		if (carry > 0)
		{
			ans[m] = carry; 
			m++; 
		}
	}
	for (i = m - 1; i >= 0; i--)
	{
		cout << ans[i];
	}
	return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

李余博睿(新疆)

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

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

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

打赏作者

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

抵扣说明:

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

余额充值