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才解决这个问题。