敲代码,练手感
1.问题描述
给出一个n长的数列,再进行m次询问,每次询问询问两个区间[L1,R1],[L2,R2],
询问数列第L2到R2个数字每一个数在数列第L1到R1个数中有多少个数字不大于它。
输入格式
第一行两个整数n,m
第二行n个整数,表示数列。
接下来m行,每行四个整数L1,R1,L2,R2,意义如上
输出格式
m行,每行R2-L2+1个整数,第一个整数表示第L2个数在数列第L1到R1个数中不大于它的个数,第一个整数表示第L2+1个数在数列第L1到R1个数中不大于它的个数,以此类推
样例输入
5 3
5 2 3 4 1
1 2 3 4
2 3 1 5
1 5 2 3
样例输出
1 1
2 1 2 2 0
2 3
数据规模和约定
n,m<=1000,数列的数字非负且小于1000。
#include<bits/stdc++.h>
using namespace std;
int a[1001],i,j,l,b[1001][1001]={0};
int main()
{
int n,m;
cin>>n>>m;
for(i=1;i<=n;i++)
{
cin>>a[i];
}
for(i=1;i<=n;i++)
{
for(j=1;j<=n;j++)
{
if(a[i]>=a[j])
b[i][j]=1;
}
}
int a1,b1,a2,b2;
for(i=0;i<m;i++)
{
int num=0;
cin>>a1>>b1>>a2>>b2;
for(j=a2;j<=b2;j++)
{
int sum=0;
for(l=a1;l<=b1;l++)
sum+=b[j][l];
if(num==0)
cout<<sum;
else
cout<<" "<<sum;
num++;
}
cout<<endl;
}
return 0;
}
2.输入说明
第一行输入N表示有N个数据(N<=1000)
第二行N个小到大非重复的数字(<=30000)
第三行数字X,查找X
输出说明
若X在序列中则输出其相应的位置,若不在序列中则输出”NO ANSWER".
样例输入
10
12 34 56 78 88 99 101 134 145 233
88
样例输出
5
样例输入
10
23 34 56 78 99 123 143 155 167 178
128
样例输出
NO ANSWER
#include<bits/stdc++.h>
using namespace std;
long long erfen(long long a[],long long l,long long r,long long x)
{
if(l>r)
return -1;
long long temp=(l+r)/2;
if(x==a[temp])
return temp;
else if(x>a[temp])
return erfen(a,temp+1,r,x);
else if(x<a[temp])
return erfen(a,l,temp-1,x);
}
int main()
{
long long n,m,a[100000],i,j,sum;
cin>>n;
for(i=0;i<n;i++)
cin>>a[i];
cin>>m;
long long temp=erfen(a,0,n-1,m);
if(temp>=0)
cout<<temp+1;
else
cout<<"NO ANSWER";
return 0;
}
3.问题描述
输入n个数,围成一圈,求连续m(m<n)个数的和最大为多少?
输入格式
输入的第一行包含两个整数n, m。第二行,共n个整数。
输出格式
输出1行,包含一个整数,连续m个数之和的最大值。
样例输入
10 3
9 10 1 5 9 3 2 6 7 4
样例输出
23
数据规模和约定
0<m<n<1000, -32768<=输入的每个数<=32767。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,a[10000],b[1000],i,j;
int num=0;
cin>>n>>m;
for(i=0;i<n;i++)
cin>>a[i];
int sum=0;
for(i=0;i<m;i++)
sum+=a[i];
b[num++]=sum;
for(i=m;i<n;i++)
{
sum=sum-a[i-m]+a[i];
b[num++]=sum;
}
int temp1=n-m,temp2=0;
for(i=0;i<m-1;i++)
{
sum=sum+a[temp2++]-a[temp1++];
b[num++]=sum;
}
sort(b,b+num);
cout<<b[num-1];
}