T1 瑞神的序列
题目描述
解决方法
题目问一个序列有多少段。
遍历一遍,判断当前点是否等于上一个点(不等就continue),然后更新上一个点。复杂度O(n)。
代码
#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include <bits/stdc++.h>
using namespace std;
int a[1009];
int main()
{
int n;
cin>>n;
if(n<=0)
{
cout<<0;
return 0;
}
for (int i = 1; i <=n; i++)
{
cin>>a[i];
}
int seg=1;
int last=a[1];
for(int i = 2; i <=n; i++)
{
if(a[i]!=last)seg++;
last=a[i];
}
cout<<seg;
return 0;
}
T2 消消乐大师——Q老师
题目描述
解决方法
求消消乐结果。首先先把输入用二维数组a存起来,一直不要动,然后横向消除,存到二维数组b中;纵向消除,存到二维数组b中。最后输出二维数组b即可。
代码
#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include <bits/stdc++.h>
using namespace std;
int inpt[30][30];
int outpt[30][30];
int main()
{
int n,m;
cin>>n>>m;
for (int i = 0; i < n; i++)
{
for (int j = 0; j < m; j++)
{
cin>>inpt[i][j];
}
}
for (int i = 0; i < n; i++)
{
int startidx=0;
int startnum=inpt[i][0];
int endidx=0;
int endnum=inpt[i][0];
for (int j = 1; j < m; j++)
{
if(inpt[i][j] == endnum)
{
endidx++;
continue;
}
if(inpt[i][j]!=endnum)
{
if(endidx-startidx>=2)
{
for (int n = startidx; n <= endidx; n++)
{
outpt[i][n]=0;
}
}
else
{
for (int n = startidx; n <= endidx; n++)
{
outpt[i][n]=inpt[i][n];
}
}
startidx=j;
startnum=inpt[i][j];
endidx=j;
endnum=inpt[i][j];
}
}
if(endidx-startidx>=2)
{
for (int n = startidx; n <= endidx; n++)
{
outpt[i][n]=0;
}
}
else
{
for (int n = startidx; n <= endidx; n++)
{
outpt[i][n]=inpt[i][n];
}
}
}
for (int i = 0; i < m; i++)
{
int startidx=0;
int startnum=inpt[0][i];
int endidx=0;
int endnum=inpt[0][i];
for (int j = 1; j < n; j++)
{
if(inpt[j][i] == endnum)
{
endidx++;
continue;
}
if(inpt[j][i]!=endnum)
{
if(endidx-startidx>=2)
{
for (int n = startidx; n <= endidx; n++)
{
outpt[n][i]=0;
}
}
startidx=j;
startnum=inpt[j][i];
endidx=j;
endnum=inpt[j][i];
}
}
if(endidx-startidx>=2)
{
for (int n = startidx; n <= endidx; n++)
{
outpt[n][i]=0;
}
}
}
for (int i = 0; i < n; i++)
{
if(i==0)
{
for (int j = 0; j < m; j++)
{
if(j==0)cout<<outpt[i][j];
else cout<<' '<<outpt[i][j];
}
}
else
{
cout<<endl;
for (int j = 0; j < m; j++)
{
if(j==0)cout<<outpt[i][j];
else cout<<' '<<outpt[i][j];
}
}
}
return 0;
}
T4 咕咕东学英语
题目描述
解决方法
本道题按照正常思路需要高达n4的复杂度(枚举回文n2,回文组合n2),无法接受。解决方法是正难则反,我们发现只有abbbbb或者baaaaaa,aaaaaab或者bbbbbbbba这种才不是delicious的,而且非1段的长度的总数是n(n-1)/2,做差即可求出delicious的数量。
注意
- n(n-1)/2需要用long long存储。
- 重复计算的(ab或者ba)要减去,利用容斥原理。
代码
#define _ ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#include <bits/stdc++.h>
using namespace std;
char a[300009];
int main()
{
long long n;
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
long long last=1;
long long ans=n*(n-1)/2;
long long repeat=0;//ans=ans-正序-倒序+repeat
for(int i=2;i<=n;i++)
{
if(a[i]==a[last])continue;
if(a[i]!=a[last])
{
repeat++;
ans=ans-(i-last);
last=i;
}
}
last=n;
for (int i=n-1;i>=1;i--)
{
if(a[i]==a[last])continue;
if(a[i]!=a[last])
{
// repeat++;
ans=ans-(last-i);
last=i;
}
}
ans+=repeat;
cout<<ans;
}