题意:
对于一个数列,计算这个数列有多少段。
分析:
对于数列,当数值发生变化时,会生成一段,比较简单的题目。
代码如下:
#include<iostream>
using namespace std;
int a[1010];
int main()
{
int n, ans = 1;
cin >> n;
for (int i = 0; i < n; i++)
cin >> a[i];
for (int i = 1; i < n; i++)
{
if (a[i] != a[i - 1])
ans++;
}
cout << ans;
return 0;
}
题意:
模拟消消乐,将应该消除的地方消除。
分析:
将每一个位置进行标记,判断其是否应该消除,如果应该消除,则改变标记(如果直接消除会对后面的判断产生影响),最后将标记的位置全部删除,考试时错误的原因是多输出了空格。
代码如下:
#include<iostream>
using namespace std;
int a[35][35];
int b[35][35];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin >> a[i][j];
b[i][j] = 1;
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m - 2; j++)
{
if (a[i][j] == a[i][j + 1] && a[i][j] == a[i][j + 2])
{
b[i][j] = 0;
b[i][j + 1] = 0;
b[i][j + 2] = 0;
}
}
}
for (int j = 0; j < m; j++)
{
for (int i = 0; i < n - 2; i++)
{
if (a[i][j] == a[i + 1][j] && a[i][j] == a[i + 2][j])
{
b[i][j] = 0;
b[i + 1][j] = 0;
b[i + 2][j] = 0;
}
}
}
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
if (b[i][j] == 0)
{
if (j == m - 1)
cout << 0;
else
cout << 0 << " ";
}
else
{
if (j == m - 1)
cout << a[i][j];
else
cout << a[i][j] << " ";
}
}
if (i != n - 1)
cout << endl;
}
return 0;
}
题意:
对于一个字符串,输出符合题目要求的字串的个数。
分析:
所有不合法的只有以下四种可能:
ABBBBBB
BAAAAAA
AAAAAAB
BBBBBBA
遍历字符串,计算字串,并除去以上四种的个数。
代码如下:
#include <bits/stdc++.h>
#define inf 2000000000000
#define N 1000010
#define p(a) putchar(a)
#define For(i,a,b) for(long long i=a;i<=b;++i)
using namespace std;
long long n,ans,l,r;
char a[N];
void in(long long &x)
{
long long y=1;char c=getchar();x=0;
while(c<'0'||c>'9'){if(c=='-')y=-1;c=getchar();}
while(c<='9'&&c>='0'){ x=(x<<1)+(x<<3)+c-'0';c=getchar();}
x*=y;
}
void o(long long x)
{
if(x<0){p('-');x=-x;}
if(x>9)o(x/10);
p(x%10+'0');
}
signed main()
{
in(n);
scanf("%s",(a+1));
ans=n*(n-1)/2,l=1;
For(i,2,n)
{
if(a[i]!=a[i-1])
{
ans-=i-l-1;
l=i;
}
}
r=n;
for(int i=n-1;i;i--)
{
if(a[i]!=a[i+1])
{
ans-=r-i;
r=i;
}
}
o(ans);
return 0;
}