这道题很简单很简单,直接见代码:
#include<iostream>
using namespace std;
int main(){
int n;
int a[1000];
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
int ans=1;
for(int i=1;i<n;i++){
if(a[i]!=a[i-1]){
ans++;
}
}
cout<<ans<<endl;
return 0;
}
T2 消消乐大师——Q老师
思路
另外开一个数组存图。
对原图,先每行遍历,符合消除条件的在另一个数组里的对应位置置为0,再每列遍历。
#include<iostream>
using namespace std;
int main(){
int n,m;
int a[50][50],b[50][50];//b considered as a temp
cin>>n>>m;
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cin>>a[i][j];
b[i][j]=a[i][j];
}
}
int row[30],col[30];
for(int i=0;i<n;i++){
//traverse every row and column
for(int j=0;j<30;j++){
row[j]=1;
}
for(int j=1;j<m;j++){
if(a[i][j]==a[i][j-1]){
row[j]+=row[j-1];
}
}
for(int j=m-1;j>=0;j--){
if(row[j]>=3){
for(int k=0;k<row[j];k++){
b[i][j-k]=0;
}
j=j+1-row[j];
}
}
}
for(int i=0;i<m;i++){
for(int j=0;j<30;j++){
col[j]=1;
}
for(int j=1;j<n;j++){
if(a[j][i]==a[j-1][i]){
col[j]+=col[j-1];
}
}
for(int j=n-1;j>=0;j--){
if(col[j]>=3){
for(int k=0;k<col[j];k++){
b[j-k][i]=0;
}
j=j+1-col[j];
}
}
}
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
cout<<b[i][j];
if(j<m-1)
cout<<" ";
}
if(i<n-1)
cout<<endl;
}
return 0;
}
思路:
将字符串ABBAAABBBB化为A(1)B(2)A(3)…这样的形式。
找规律,我们可以知道,只有当字符串形式为ABBB或者BAA这种A(N)B(M)形式的时候
不符合delicious的定义,那么我们只算出不是delicious的子串有多少就行了。
算法:对于每一个A(N)B(M),考虑AB(M),有M个非delicious子串,再考虑A(N)B,有N个,减去AB重合串,共N+M-1个。计算首尾位置的时候特判一下。
#include<iostream>
#include<cstring>
#include<vector>
using namespace std;
int main(){
int n;
cin>>n;
string ss;
cin>>ss;
vector<int> ss_mdf;
int i=0,cnt=1;
//simplify the string to form "A(N)B(N)A(M)```"
while(i<n-1){
if(ss[i]==ss[i+1]){
i++;
cnt++;
}
else{
ss_mdf.push_back(cnt);
i++;
cnt=1;
}
}
ss_mdf.push_back(cnt);
long long ans=(long long)(n-1)*n/2;
if(ss_mdf.size()>1)
for(i=0;i<ss_mdf.size();i++){
if(i==0||i==ss_mdf.size()-1)
{
ans-=ss_mdf[i];
}
else{
ans-=2*ss_mdf[i];
}
}
ans+=ss_mdf.size()-1;
cout<<ans<<endl;
return 0;
}