Codeforces Round #612 (Div. 2)----我炸了(微笑脸)

啊啊啊啊啊啊啊啊啊啊!!!太过分了!这一场竟然这么坑爹!!!!

B题死活读不懂。。C题死活a不了,我怕是个zz哦!哭唧唧,,

还以为今晚还能看到tourist,结果也没有看到,哭唧唧。。

这次绝壁要绿了。。。凉凉~~我太菜了!!哭唧唧~~

 

A,大水题,连续的A的个数,(除了从左边第一个位置开始的连续A,)最长的那个,就是答案

代码:(虽然挂了没啥必要,可是毕竟这是这场唯一出了的题目!!!!!!)

#include
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3fLL
#define inf 0x3f3f3f3f
#define maxn 100010
using namespace std;
int n,a[maxn],T,ans,s,l;
char ch[105];
int main()
{
    scanf("%d",&T);
    while(T--)
    {
 
        scanf("%d",&n);
        scanf("%s",ch);
        ch[n]='A';
        ans=s=0;
        for(int i=0;i<=n;i++)
        {
            if(ch[i]=='A') {l=i;break;}
        }
        for(int i=l+1;i<=n;i++)
        {
            if(ch[i]=='P') s++;
            else {ans=max(ans,s);s=0;}
        }
        printf("%d\n",ans);
    }
}

B题WTF!!看不懂!!看了好几遍,就是看不懂,过了。。做C,凉凉。。。WA+11最后也没A出来,脑子瓦特了,贪心题,真是把它想简单了,有很多细节,都没有注意到!应该多动动笔。。。纯想给自己想懵了,不过应当是个,能够做的题的!真是恶心死了!

 

C、

赛后终于A了这个破题!!!思路没错,贪心做的!但是最后有点慌了,敲错了两个细节。。(实际dp,做起来很简单!!)

当然可能不是最优的,但是最后的时间,我的脑子能考虑的,只有对首尾情况暴力分析了,,,所以复制了四遍代码。。。

代码:

#include
#define ll long long
#define INF 0x3f3f3f3f3f3f3f3fLL
#define inf 0x3f3f3f3f
#define maxn 100010
using namespace std;
int n,x,c,v,cc,vv,anss,pp,qq,ss;
int main()
{
    scanf("%d",&n);
    vectora[2];
    int be=-1,rt=0;
    int jishu=(n+1)/2,oushu=n/2,ans=0;

    for(int i=1;i<=n;i++)
    {
        scanf("%d",&x);
        if(x==0) continue;
        if(x%2) jishu--;
        else oushu--;

        if(be==-1||x%2==be)
        {
            if(be==-1) {c=i-rt-1;cc=x%2;}
            else
            a[x%2].push_back(i-rt-1);
        }
        else
        {
            ans++;
        }
        be=x%2;
        rt=i;
    }
    ss=ans;
    vv=be%2;
    v=n-rt;
    if(v==n) {printf("%d\n",n==1?0:1);return 0;}

    sort(a[0].begin(),a[0].end());
    sort(a[1].begin(),a[1].end());
     ////////////////
    int l=0,r=0;

    pp=jishu;qq=oushu;
    while(l=a[0][l])
    {
        oushu-=a[0][l];
        l++;
    }
    while(r=a[1][r])
    {
        jishu-=a[1][r];
        r++;
    }

    ans+=2*(a[0].size()-l+a[1].size()-r)+(c!=0)+(v!=0);
    anss=ans;

/////////////////////
    jishu=pp;oushu=qq;l=0,r=0;
    ans=ss;
    if(cc==1)
    {
        if(jishu>=c)
        jishu-=c;
        else ans++;
    }
    else
        {
            if(oushu>=c)
                oushu-=c;
                else ans++;
        }//cout<=v)
            jishu-=v;
            else ans++;
        }
        else {

                if(oushu>=v)oushu-=v;
                else ans++;
        }

    while(l=a[0][l])
    {
        oushu-=a[0][l];
        l++;
    }
    while(r=a[1][r])
    {
        jishu-=a[1][r];
        r++;
    }
    ans+=2*(a[0].size()-l+a[1].size()-r);
   //  cout<=v)
            jishu-=v;
            else ans++;
        }
        else {

                if(oushu>=v)oushu-=v;
                else ans++;
        }

    while(l=a[0][l])
    {
        oushu-=a[0][l];
        l++;
    }
    while(r=a[1][r])
    {
        jishu-=a[1][r];
        r++;
    }
    ans+=2*(a[0].size()-l+a[1].size()-r)+(c!=0);
    anss=min(anss,ans);
//////////////////
    jishu=pp;oushu=qq;l=0;r=0;
    ans=ss;
    if(cc==1)
    {
        if(jishu>=c)
        jishu-=c;
        else ans++;
    }
    else
        {
            if(oushu>=c)
                oushu-=c;
                else ans++;
        }

    while(l=a[0][l])
    {
        oushu-=a[0][l];
        l++;
    }
    while(r=a[1][r])
    {
        jishu-=a[1][r];
        r++;
    }
    ans+=2*(a[0].size()-l+a[1].size()-r)+(v!=0);
    /////////////
    anss=min(anss,ans);
    printf("%d\n",anss);
}

dp代码:

#include
using namespace std;
int f[109][109][2],a[109];
int main(){
	register int n,i,j,s;
	scanf("%d",&n),s=(n+1)/2;
	memset(f,63,sizeof(f)),f[n+1][0][0]=f[n+1][0][1]=0;
	for(i=1;i<=n;++i){
		scanf("%d",a+i);
		if(a[i]&1)--s;
	}
	for(i=n;i;--i){
		for(j=s;j>=0;--j){
			if(a[i]&1){
				f[i][j][1]=min(f[i+1][j][0]+1,f[i+1][j][1]);
			}else if(!a[i]){
				if(j)f[i][j][1]=min(f[i+1][j-1][0]+1,f[i+1][j-1][1]);
				f[i][j][0]=min(f[i+1][j][0],f[i+1][j][1]+1);
			}else{
				f[i][j][0]=min(f[i+1][j][0],f[i+1][j][1]+1);
			}
		}
	}
	printf("%d\n",min(f[1][s][0],f[1][s][1]));
	return 0;
}

 

 

你可能感兴趣的:(codeforces)