A:毒牡蛎
知识点:分支结构
思路:sick sick 表示都吃了有病的牡蛎,则1号牡蛎有病毒。 fine sick 表示高桥没吃有毒牡蛎,青木吃了有病的牡蛎,则3号牡蛎有病毒。 sick fine 表示高桥吃了有毒牡蛎,青木没吃有病的牡蛎,则2号牡蛎有病毒。 fine fine 表示都没吃有病的牡蛎,则4号牡蛎有病毒
参考代码:
#include<bits/stdc++.h>
using namespace std;
string s1,s2;
int main(){
cin>>s1>>s2;
if(s1=="sick"&&s2=="fine"){
cout<<2;
}else if(s1=="fine"&&s2=="sick"){
cout<<3;
}else if(s1=="fine"&&s2=="fine"){
cout<<4;
}else{
cout<<1;
}
return 0;
}
B:单词缩写
知识点:字符串
思路:首先在[1,n]之间处理所有的字符串,并确定其最小的子串。具体方法是,在[1,s[i].size()]之间进行枚举,从0开始截取对应长度,然后获得一个子串sub。接着,我们要在[1,n]范围之内进行判断,如果sub不是其他任何字符串的前缀,那么说明sub符合条件,可以输出。
参考代码:
#include<bits/stdc++.h>
using namespace std;
string s[51];
int n;
bool check(int l,int id){
for(int i=1;i<=n;i++){
if(id==i)continue;
if(s[id].substr(0,l)==s[i].substr(0,l)){
return 0;
}
}
return 1;
}
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>s[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=s[i].size();j++){
if(check(j,i)){
cout<<s[i].substr(0,j)<<endl;
break;
}
}
}
return 0;
}
C:A..B..C
知识点:枚举
思路:使用三个数组a[101]、b[101]、c[101]单独存储'A'、'B'、'C'三个单词出现的位置,再分别枚举'A'、'B'、'C'出现的数量,若满足b[j]-a[i]==c[k]-b[j]&&a[i]<c[k]&&b[j]<c[k]则统计答案数量即可。注意i的范围为为'A'出现的次数,j的范围为为'B'出现的次数,k的范围为为'C'出现的次数。
参考代码:
#include<bits/stdc++.h>
using namespace std;
string s;
int a[101],b[101],c[101],_a,_b,_c,ans;
int main(){
cin>>s;
for(int i=0;i<s.size();i++){
if(s[i]=='A') a[++_a]=i;
if(s[i]=='B') b[++_b]=i;
if(s[i]=='C') c[++_c]=i;
}
for(int i=1;i<=_a;i++)
for(int j=1;j<=_b;j++)
for(int k=1;k<=_c;k++)
if(b[j]-a[i]==c[k]-b[j]&&a[i]<c[k]&&b[j]<c[k])
ans++;
cout<<ans;
return 0;
}
D:积木大赛
知识点:贪心
思路:若a[i]=a[i+1],即左边的一组比右边的高,当高度满足左面时,右边的也一定满足了,所以不需要增加ans。 所以最终结果就是ans。
参考代码:
#include<bits/stdc++.h>
using namespace std;
long long n,a[100001],ans;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>a[i-1])ans+=a[i]-a[i-1];
}
cout<<ans;
return 0;
}