程序设计第三次CSP模拟
to sum up
本次csp模拟整体难度比较简单吧,前两个题没太话费多长时间。一开始做t4写了二十几分钟以为自己做出来了,然后自己出的样例也能跑过(其实当时以为正确的其实是错误的。然后检查时候仔细读了遍题发现自己一开始理解错了。emmm到最后t4也没A上,有、、遗憾。列一下题吧。
T1
解题思路及代码
#include <iostream>
using namespace std;
const int MAXN =1e4;
int a[MAXN];
int n;
int main()
{
cin>>n;
int tar,cnt;
cnt=1;
cin>>a[0];
tar=a[0];
for(int i=1;i<n;i++)
{
cin >> a[i];
if(a[i]!=tar)
{
tar=a[i];
cnt++;
}
}
cout<<cnt<<endl;
return 0;
}
T2
解题思路及代码
#include <iostream>
using namespace std;
const int MAXN =35;
int a[MAXN][MAXN];
int b[MAXN][MAXN];
int n,m;
void line_del()
{
for(int i=1;i<=n;i++)
{
int tmp=1;
int cnt=1;
int tar=a[i][tmp];
while(tmp<m)
{
tmp++;
if(a[i][tmp]==tar)
cnt++;
else
{
if(cnt>=3)
for(int k=tmp-cnt;k<=tmp-1;k++)
b[i][k]=0;
tar=a[i][tmp];
cnt=1;
}
}
if(cnt>=3)
{
for(int k=m-cnt+1;k<=m;k++)
{
b[i][k]=0;
}
}
}
}
void col_del()
{
for(int i=1;i<=m;i++)
{
int tmp=1;
int cnt=1;
int tar=a[tmp][i];
while(tmp<n)
{
tmp++;
if(a[tmp][i]==tar)
cnt++;
else
{
if(cnt>=3)
for(int k=tmp-cnt;k<=tmp-1;k++)
b[k][i]=0;
tar=a[tmp][i];
cnt=1;
}
}
if(cnt>=3)
{
for(int k=m-cnt+1;k<=m;k++)
{
b[k][i]=0;
}
}
}
}
int main()
{
cin>>n;
cin>>m;
for(int i=1;i<=n;i++)
{
for (int j = 1; j <= m; j++)
{
cin >> a[i][j];
b[i][j]=1;
}
}
line_del();
col_del();
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
if(b[i][j]==0)
cout<<0;
else
cout<<a[i][j];
if(j!=m)
cout<<' ';
}
if(i!=n)
cout<<endl;
}
return 0;
}
T3
解题思路及代码
一开始想的过于简单,就简单的判断了下回文串。后来理解下题意发现,只要每个字符属于包含区间内的一个回文子串就可以。然后我就开始了各种情况的模拟,最后还是缺少了一些情况。看到天祥dl的反向求法后菜鸡顿悟。先求出所有子串数,直接判断不符合条件的,然后相减。
原博:
回文子串
#include <iostream>
using namespace std;
const int maxn=3e5+100;
char a[maxn];
long long sum,ans,cnta,cntb;
int n;
int main()
{
cin>>n;
for(int i=1; i<=n; i++)
cin>>a[i];
sum=(long long)n*(long long)(n-1)/(long long)2;
ans=0;
cnta=0,cntb=0; //满足条件子串的个数统计
int prea=0,preb=0; //标记 前面是不是有a或者b
for(int i=1; i<=n; i++)
{
if(a[i]=='A')
{
cnta++;
prea=1;
if(cnta==1 && preb)
ans+=cntb;
if(cnta>1 && preb)
ans++;
cntb=0;
}
else
{
cntb++;
preb=1;
if(cntb==1 && prea)
ans += cnta;
if(cntb>1 && prea)
ans++;
cnta=0;
}
}
cout<<sum-ans;
return 0;
}