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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值