本文主要是介绍牛客周赛45,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
牛客周赛45
- a小紫的总分
- b小蓝的旅游
- c小粉的好数
- d 小黑的区间
a小紫的总分
小紫总分
ac code
#include<iostream>
using namespace std;
int res=0;
int main(){for(int i=0;i<5;i++){int a;cin>>a;res+=a;}if(res>100)printf("YES\n");else printf("NO\n");return 0;
}
b小蓝的旅游
小蓝旅游
ac code
#include<iostream>
using namespace std;
int main(){int a,b;scanf("%d%d",&a,&b);if(a%2==0||b%2==1)printf("YES\n");else printf("NO\n");
}
c小粉的好数
小粉好数
ac code
#include<iostream>
using namespace std;
int st[100010];//st数组储存是否为好数
int res=0;
bool key(int n){int tmp=n;int ans=0;while(n){//求出各个位数ans+=n%10;n/=10;}if(ans%2==0&&ans>=tmp)return true;else if(ans%2==0&&st[ans])return true;else return false;
}
int main(){for(int i=1;i<=100000;i++){if(key(i)){st[i]=true;}}int n;scanf("%d",&n);for(int i=1;i<=n;i++){if(st[i])res++;}printf("%d",res);
}
d 小黑的区间
小黑区间
该题使用双指针,也可以说是滑动窗口,j指针在左边,i指针靠右,注意这里:res+=j-i,举个例子,i=3;j=6,那么j-i=3,表示以3为起点,j为终点的区间中有3,3;3,4;3,5这三个区间,(仔细看代码,这里i是闭区间,j是开区间)
ac code
#include<bits/stdc++.h>
using namespace std;
int mp[100010];
int arr[100010];
long long res=0;
int main(){memset(mp,-1,sizeof(mp));int n,k;scanf("%d%d",&n,&k);for(int i=0;i<n;i++){scanf("%d",&arr[i]);}for(int i=0,j=0;i<n;i++){while(j<n&&(mp[arr[j]]<i||j-mp[arr[j]]<=k)){//如果j在正常区间,而且当前颜色没有出现过或者与上一次//差值小于给定距离,成立mp[arr[j]]=j;j++;}//printf("在%d-%d处出错\n",i,j);// if(mp[arr[i]=i])mp[arr[i]]=0;//i向右走了,当前i值更新一下res+=j-i;//printf("此时符合区间%d-%d\n",i,j);}printf("%lld",res);return 0;
}
这题卡到map了,改了半天,map容器是整形的话,初始值是0,那这里如果我用map<int,int>mp,就会在第一次进入while循环时候卡死,改为数组后初始化为-1才解决这个问题。
这篇关于牛客周赛45的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!