codeforces #220 div2前三題

果7發表於2013-12-26

A題很簡單,先給棋盤的大小,然後給定初始座標位置,然後給可以變換的a,b。問最小的步數可以到達棋盤的任何一個角落。這個題目很簡單,卻容易忽略一個問題,就是在走的過程中千萬不能走出棋盤規定的大小。

程式碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100000000;

int main()
{
    int n,m,sx,sy,a,b;
    while(cin>>n>>m>>sx>>sy>>a>>b)
    {
        int ans=maxn;
        int sum;

        int flag=0;
        if(sx+a>n&&sx-a<1)    //不能跳出棋盤
            flag=1;
        if(sy+b>m&&sy-b<1)
            flag=1;
        if((sx==1&&sy==1)||(sx==n&&sy==m)||(sx==1&&sy==m)||sx==n&&sy==1)
        {
            cout<<"0"<<endl;
            continue;
        }
        else if(flag)
        {
            puts("Poor Inna and pony!");
            continue;
        }
        else
        {
            if((sx-1)%a==0&&(sy-1)%b==0)   //1 1
            {
                sum=(sx-1)/a+(sy-1)/b;
                if(sum%2==0)
                {
                    int tmp=max((sx-1)/a,(sy-1)/b);
                    ans=min(ans,tmp);
                }
            }
            if((n-sx)%a==0&&(sy-1)%b==0)   //n 1
            {
                sum=(n-sx)/a+(sy-1)/b;
                if(sum%2==0)
                {
                    int tmp=max((n-sx)/a,(sy-1)/b);
                    ans=min(ans,tmp);
                }
            }
            if((sx-1)%a==0&&(m-sy)%b==0)  //1 m
            {
                sum=(sx-1)/a+(m-sy)/b;
                if(sum%2==0)
                {
                    int tmp=max((sx-1)/a,(m-sy)/b);
                    ans=min(ans,tmp);
                }
            }
            if((n-sx)%a==0&&(m-sy)%b==0)  //n m
            {
                sum=(n-sx)/a+(m-sy)/b;
                if(sum%2==0)
                {
                    int tmp=max((n-sx)/a,(m-sy)/b);
                    ans=min(ans,tmp);
                }
            }
        }
        if(ans==maxn) puts("Poor Inna and pony!");
        else cout<<ans<<endl;
    }
    return 0;
}


然後是B題,也是個簡單題目,結果出題人給判的資料出現了失誤,結果大多數人竟然也理解錯了。45454可以是499,949,994,出題人理解成了只有499和994兩種,我也理解成了兩種。。。

程式碼:

#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<algorithm>
using namespace std;
const int maxn=100005;
char a[maxn];
int t[maxn];


int main()
{
    __int64 res;
    while(cin>>a)
    {
        res=1;
        int i,j,k,len=strlen(a);
        for(i=0;i<len;i++)
            t[i]=a[i]-'0';
        for(i=0;i<len-1;)
        {
            if(t[i]+t[i+1]!=9)
            {
                i++;
                continue;
            }
            else if(t[i]+t[i+1]==9)
            {
                int tmp=0;
                j=i,k=i+1;
                while(1)
                {
                    if(k>=len) break;
                    if(t[j]+t[k]==9)
                    {
                        j++;
                        k++;
                        tmp++;
                    }
                    else break;
                }

                if(tmp%2==0)   //出題人想錯了,我們大家也跟著想錯了。。
                {
                    res=res*(tmp/2+1);
                }
                i=i+tmp+1;
                continue;
            }
        }
        printf("%I64d\n",res);
    }
    return 0;
}


C題,記憶化搜尋,開始沒有記憶化,果斷超時了,每次利用前面搜過的,如果沒有搜過則比較然後得到最優解。

程式碼:

#include<iostream>
#include<cstring>
#include<cstdio>
#include<map>
const int maxn = 1e9;
using namespace std;
char mp[1005][1005];
char dir[4][2]={{-1,0},{1,0},{0,1},{0,-1}};
int ans[1005][1005];
int visi[1005][1005];

int res,n,m;
map<char,char> mq;

int dfs(int x,int y)
{
    int cx,cy,tmp,ma=0;
    if(ans[x][y]>0) return ans[x][y]; //已經搜過
    for(int i=0;i<4;i++)
    {
        cx=x+dir[i][0],cy=y+dir[i][1];
        if(cx>=0&&cx<n&&cy>=0&&cy<m&&mq[mp[x][y]]==mp[cx][cy])
        {
            if(visi[cx][cy])    ma=maxn;   //說明有迴路.
            else
            {
                visi[cx][cy]=1;
                tmp=dfs(cx,cy);
                visi[cx][cy]=0;
                ma=max(ma,tmp);
            }
        }
    }
    ans[x][y]=ma+1;
    return ma+1;
}

int main()
{
    mq['D']='I',mq['I']='M',mq['M']='A',mq['A']='D';
    int i,j,res;
    while(cin>>n>>m)
    {
        res=0;
        memset(ans,0,sizeof(ans));
        memset(visi,0,sizeof(visi));
        for(i=0;i<n;i++)
            scanf("%s",mp[i]);

        for(i=0;i<n;i++)
            for(j=0;j<m;j++)
            {
                if(!visi[i][j]&&mp[i][j]=='D'&&!ans[i][j])
                {
                    visi[i][j]=1;
                    res=max(res,dfs(i,j));
                    visi[i][j]=0;
                }
            }
        if(res>=maxn) puts("Poor Inna!");
        else if(res<4) puts("Poor Dima!");
        else printf("%d\n",res/4);
    }
    return 0;
}

/*
5 5
DIMAD
DIIDI
DIMAM
DDMMA
AAMID
5 5
DIMAD
DIMAI
DIMAM
DDMAA
AAMID
*/


相關文章