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