# 概况

Rating:$\color{green}{+118}$($\color{purple}{1910}$)

(上$\color{purple}{紫}$啦!)

# 题目

## A. Sushi for Two

AC时间:3min,496分

code:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],ans,tot,lst;
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scanf("%d",&a[i]),a[i]!=a[i-1]?ans=max(ans,min(tot,lst)),lst=tot,tot=0:0,++tot;
ans=max(ans,min(lst,tot));
printf("%d",ans*2);
return 0;
}

## B. Circus

AC时间:33min,845分(-1)

B题想了半小时。。。我以为我完了。。。

$c_i=1,a_i=0$为第一种,数量为$tot_1$;$c_i=1,a_i=1$为第二种,数量为$tot_2$;$c_i=0,a_i=1$为第三种,数量为$tot_3$;$c_i=0,a_i=0$为第四种,数量为$tot_4$

code:

#include<bits/stdc++.h>
using namespace std;
int n,c[5010],a[5010],tot1,tot2,tot3,tt1,tt2,tt3,tt4,t1,t2;
void scan(int &x){
x=getchar();
while(!isdigit(x))x=getchar();
x-='0';
}
int main(){
scanf("%d",&n);
for(int i=1;i<=n;++i)scan(c[i]);
for(int i=1;i<=n;++i)scan(a[i]),c[i]?(a[i]?++tot2:++tot1):tot3+=a[i];
for(int i=0;i<=tot1;++i){
for(int j=0;j<=tot2&&i+j<=n/2;++j){
t1=i+j,t2=tot2-j;
if(t1<t2)continue;
tt1=i,tt2=j,tt3=tot3-(t1-t2),tt4=n/2-tt1-tt2-tt3;
if(tt1>tot1||tt2>tot2||tt3>tot3||tt4>n-tot1-tot2-tot3)continue;
if(tt3>=0&&tt4>=0)goto ANS;
}
}
puts("-1");
return 0;
ANS:
for(int i=1;i<=n;++i){
if(c[i]&&!a[i]&&tt1)printf("%d ",i),--tt1;
if(c[i]&&a[i]&&tt2)printf("%d ",i),--tt2;
if(!c[i]&&a[i]&&tt3)printf("%d ",i),--tt3;
if(!c[i]&&!a[i]&&tt4)printf("%d ",i),--tt4;
}
return 0;
}

## C. Skyscrapers

AC时间:49min,1476分

code:

#include<bits/stdc++.h>
using namespace std;
struct CMP{
int id,v;
}c[1010];
int n,m,a[1010][1010],rnkr[1010][1010],rnkc[1010][1010],mxr[1010],mxc[1010],t;
bool cmp(CMP x,CMP y){
return x.v<y.v;
}
int main(){
scanf("%d%d",&n,&m);
for(int i=1;i<=n;++i)for(int j=1;j<=m;++j)scanf("%d",&a[i][j]);
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j)c[j]=(CMP){j,a[i][j]};
sort(c+1,c+m+1,cmp);
for(int j=1;j<=m;++j)c[j].v>c[j-1].v?++mxr[i]:0,rnkr[i][c[j].id]=mxr[i];
}
for(int i=1;i<=m;++i){
for(int j=1;j<=n;++j)c[j]=(CMP){j,a[j][i]};
sort(c+1,c+n+1,cmp);
for(int j=1;j<=n;++j)c[j].v>c[j-1].v?++mxc[i]:0,rnkc[c[j].id][i]=mxc[i];
}
for(int i=1;i<=n;++i){
for(int j=1;j<=m;++j){
t=max(rnkr[i][j],rnkc[i][j]);
printf("%d ",max(mxr[i]+(t-rnkr[i][j]),mxc[j]+(t-rnkc[i][j])));
}
puts("");
}
return 0;
}

## D. Camp Schedule

AC时间:1h24min,1413分(-1)

border怎么求呢?

1.剩下的长度不够放了;

2.放完后串的1的数量大于$s$中1的数量,或者0的数量大于$s$中的0数量。

code:

#include<bits/stdc++.h>
using namespace std;
char s[500010],t[500010],p[500010];
int n,m,t1,tmp,nw,nxt[500010],len;
void getnxt(){
nxt[1]=0;
nw=0;
for(int i=2;i<=n;i++){
while(nw!=0&&t[nw+1]!=t[i])nw=nxt[nw];
if(t[nw+1]==t[i])nxt[i]=++nw;
else nxt[i]=nw;
}
}
int main(){
scanf("%s%s",s+1,t+1);
n=strlen(s+1),m=strlen(t+1);
if(m>n)return(printf("%s",s+1),0);
getnxt(),len=nxt[m];
for(int i=1;i<=n;++i)t1+=s[i]=='1';
for(int i=1;i<=m;++i)tmp+=t[i]=='1';
if(tmp>t1)return(printf("%s",s+1),0);
if(n-m+tmp<t1)return(printf("%s",s+1),0);
for(int i=1;i<=m;++i)p[i]=t[i];
t1-=tmp,tmp=0,nw=len+1;
for(int i=1+len;i<=m;++i)tmp+=t[i]=='1';
for(int i=m+1;i<=n;++i,nw=(nw==m?len+1:nw+1)){
if(t[nw]=='0'){
if(n-i+1==t1){
for(int j=i;j<=n;++j)p[j]='1';
break;
}else p[i]='0';
}else{
if(!t1){
for(int j=i;j<=n;++j)p[j]='0';
break;
}else p[i]='1',--t1;
}
}
printf("%s",p+1);
return 0;
}

# 总结

posted @ 2019-03-15 15:32 xryjr233 阅读(...) 评论(...) 编辑 收藏