B、小红的字符串
思路:比赛中我的思路是通过substr函数提取长度为2的字符串字串,再通过比较ASCLL码进行交换,但是这样写导致了运行超时。根据讲解,可以用sort函数进行排序。
#include<iostream>
#include<string>
#include<algorithm>
using namespace std;
string str;
int main(){
string s;
cin>>s;
int length=s.length();
if(length<2) return 0;
const int n=length-1;
string substrings[n];
for(int i=0;i<n;++i){
substrings[i]=s.substr(i,2);
}
sort(substrings,substrings+n);//长度为n的字符串恰好会有n-1个长度为2的连续字串
for(int i=0;i<n;i++){
cout<<substrings[i]<<endl;
}
return 0;
}
根据讲解,在提取字串时还可以使用另一种方式,通过将前一个字符和当前字符拼接到一起就组成了长为2的串
for(int i=0;i<length;++i){
string temp;
temp+=s[i-1];
temp+=s[i];
substrings[i-1]=temp;
}
C、炸砖块
思路:比赛中不知道该用什么知识去解决,不敢写,纠结的地方在于砖块下落该如何处理。赛后想了一下可以通过swap函数进行交换,注意在炸砖块时不能仅仅把炸的区域变为空,应该是先调整位置,防止砖块重复被炸。
#include<iostream>
using namespace std;
int main(){
char zhuan[1010][1010];
int n,m,k;
cin>>n>>m>>k;
for(int i=0;i<n;i++){//初始化矩阵
for(int j=0;j<m;j++){
zhuan[i][j]='*';
}
}
int x,y;
for(int i=0;i<k;i++){
cin>>x>>y;
x--;
y--;
for(int i=x;i>=0;i--){//应该是从底部向上面遍历,如果该部位有砖块,一定是上面没有砖块
if(zhuan[i][y]=='*'){
zhuan[i][y]='.';
break;
}
}
for(int i=x;i>0;i--){
if(zhuan[i][y]=='.'&&zhuan[i-1][y]=='*'){//将上方的砖块下移
swap(zhuan[i][y],zhuan[i-1][y]);
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<zhuan[i][j];
}
cout<<endl;
}
return 0;
}
D、小红的统计区间(easy)
思路: 双指针模型,固定左端点,右端点向右,一直到和不小于k,右端点加右侧剩下的点的和就是左端点满足区间的个数,随后移动左端点重复。
#include<iostream>
#include<string>
using namespace std;
int a[100010];
int main(){
long long n,i,k,sum=0,res=0;
cin>>n>>k;
for(i=1;i<=n;i++) cin>>a[i];
int j=1;
for(i=1;i<=n;i++)
{
sum+=a[i];
while(sum>=k){
sum-=a[j];
j++;
}
res+=j-1;
}
cout<<res;
return 0;
}