最新消息: USBMI致力于为网友们分享Windows、安卓、IOS等主流手机系统相关的资讯以及评测、同时提供相关教程、应用、软件下载等服务。

黑龙江农垦科技职业学院喜迎寒假多校联赛2A,C,F,G,H,I,J题解

IT圈 admin 44浏览 0评论

黑龙江农垦科技职业学院喜迎寒假多校联赛2 A,C,F,G,H,I,J题解

黑龙江农垦科技职业学院喜迎寒假多校联赛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);}

黑龙江农垦科技职业学院喜迎寒假多校联赛2 A,C,F,G,H,I,J题解

黑龙江农垦科技职业学院喜迎寒假多校联赛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);}
发布评论

评论列表 (0)

  1. 暂无评论