黑龙江农垦科技职业学院喜迎寒假多校联赛2 (欢 乐 A K 场) A,C,F,G,H,I,J题解
题目链接
A.
由于该题数据过大 首先就要使用到快读 不然会超时
快读模板以及解析(转载)
如果直接使用暴力每一次累加去做一次if判断,一定会超时,所以最好把累加就做一个数组,判断时候就可以直接运用这个数组去截取
储存累加数组
for(long long i=1;i<=n;i++){
a=read();
sum[i]=sum[i-1]+a;
}
有了这个数组后 我们就可以在里面直接截取询问值,大大减少了代码复杂度
判断及输出
l=0; r=1;
while(r<=n)
{
p=sum[r]-sum[l];
if(k==p) Max=max(Max,r-l);
if(p>k) l++;
if(p<k||r-l<=Max) r++;
}
if(Max==0) printf("-1\n");
else printf("%lld\n",Max);
return 0;
sum数组记得开全局数组,在全局数组里所有值都已经初始化为0且开的范围也可以更大
.
.
.
.
.
C.
一样还是要使用快读不然也会超时
其他的大致和A题思路一样,所以就直接贴代码把
#include<iostream>
using namespace std;
long long a[1000010];
long long pp(){
char ch;
while(ch =getchar(), ch < '0' || ch > '9');
long long res = ch - 48;
while(ch = getchar(), ch >= '0' && ch <= '9')
res = res * 10 + ch - 48;
return res;
}
int main()
{
long long n,m,sum,p,r,l;
n=pp(); m=pp();
for(long long i=1;i<=n;i++)
{
p = pp();
a[i] = a[i-1] + p;
}
while(m--){
r = pp();
l = pp();
cout<<a[l] - a[r-1]<<endl;
}
}
.
.
.
.
.
F.
做F题前 先要了解异或运算是什么
简单来说 就是两个二进制的每一位进行对比,若相同则新的二进制的一位为0,不相同则为1
举个栗子:10和01进行异或运算为11 11和01进行异或运算为10
这题的例子中
例一:10000 输出:16383 一开始我很疑惑有什么规律 然后我就百度了一下16838和10000的二进制数为多少 就发现规律了
16383:11111111111111
10000:10011100010000
发现没有,位数都相等,所以这题就是找到最大的二进制位数然后把所有的0换成1就可以了,而最大的二进制位数就是n
所以发现规律后这题就很简单了
#include<iostream>
#include<cstring>
using namespace std;
int main(){
unsigned long long n,k,i=1,er=0,con=0,sum=0;
scanf("%lld",&n);
while(n>0)
{
n/=2;
con++;
}
sum=1;
for(int i=1;i<=con;i++)
{
sum*=2;
}
printf("%lld",sum-1);
}
直接统计n的二进制有几位再直接计算就可以了
.
.
.
.
.
G.
这题主要最难的地方就是判断这句话里是否有Alan这个字符串(主要Alan中间还夹杂空格)
可以用KMP算法来直接判断(当字符串里有空格时直接将指针右移就好)
KMP详解
这题的KMP
for(int i=0;i<k;i++)
{
if(a[i]==p[j]) j++; //如果字符能够匹配 Alan指针向右移
else if(a[i]!=' '&&a[i]!=p[j]) j=0; //如果a[i]等于了空格i也向右移
if(j==3) break; //如果能够匹配成功 就判断这个字符串有Alan这个字符串
}
判断出了这个字符串里有Alan这个字符串后就变得非常简单了
当判断出这个字符串有Alan后可以直接用for循环进行计算有多少个%
if(j==3)
{
for(int i=0;i<k;i++)
{
if(a[i]=='%') sum++;
}
}
.
.
.
.
.
H,I(两题是一个代码)
首先一个用户有多个数据 所以用结构体储存这些数据是最好的
struct number{
string id;
string mm;
string ph;
string sex;
int p;//用来储存顺序
}k[10010];
之后先是一个简单的输入进结构体
for(int i=1;i<=n;i++)
{
cin>>k[i].id>>k[i].mm>>k[i].sex>>k[i].ph;
k[i].p=i; //p用来储存顺序
}
最最最重要的就是这里面的排序了!!!!!搞了我好久好久好久
先在主函数里写好
sort(k+1,k+1+n,cmp);
结构体排序!!!
int cmp(number a,number b)
{
if(a.id.size()!=b.id.size()) return a.id.size()<b.id.size();//如果两个ID长度不等就可以直接比出来
else{
if(a.id==b.id) return a.p<b.p; //如果两个ID相等就比较输入顺序
else if(a.id!=b.id) return a.id<b.id; //相等就比较两个ID大小
else return a.p>b.p;
}
}
然后直接在主函数里输出结构体就完事了!
for(int i=1;i<=n;i++)
{
cout<<k[i].id<<' '<<k[i].mm<<' '<<k[i].sex<<' '<<k[i].ph<<endl;
}
.
.
.
.
.
J.
这题就没啥了吧
简简单单的签到题找最小值下标而已而已
#include<iostream>
using namespace std;
int main()
{
int n;
int min=100,l=1;
scanf("%d",&n);
int a[10010];
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
if(min>a[i])
{
l=i;
min=a[i];
}
}
printf("%d",l);
}