HDU 4731 找规律,打表

http://acm.hust.edu.cn/vjudge/contest/126262#problem/D

 

分为3种情况,n=1,n=2,n>=3

其中需要注意的是n=2的情况,通过打表找规律

 

#include <iostream>
#include <string>
#include <cstring>
#include <cstdlib>
#include <cstdio>
#include <cmath>
#include <algorithm>
#include <stack>
#include <queue>
#include <cctype>
#include <vector>
#include <iterator>
#include <set>
#include <map>
#include <sstream>
using namespace std;

#define mem(a,b) memset(a,b,sizeof(a))
#define pf printf
#define sf scanf
#define spf sprintf
#define pb push_back
#define debug printf("!\n")
#define MAXN 100000 +5
#define MAX(a,b) a>b?a:b
#define blank pf("\n")
#define LL long long
#define ALL(x) x.begin(),x.end()
#define INS(x) inserter(x,x.begin())
#define pqueue priority_queue
#define INF 0x3f3f3f3f

#define ls (rt<<1)
#define rs (rt<<1|1)

int n,m;

char a[MAXN];

int main()
{
    int t,kase=1,i,j,k;
    sf("%d",&t);
    while(t--)
    {
        sf("%d%d",&n,&m);
        pf("Case #%d: ",kase++);
        if(n==1)
        {
            for(i=0;i<m;i++) pf("a");
        }
        else if(n==2)
        {
            if(m == 1) pf("a");
            else if(m==2) pf("ab");
            else if(m==3) pf("aab");
            else if(m==4) pf("aabb");
            else if(m==5) pf("aaaba");
            else if(m==6) pf("aaabab");
            else if(m==7) pf("aaababb");
            else if(m==8) pf("aaababbb");
            else
            {
                int v = 0;
                char tmp[] = "aababb";
                pf("aa");
                for(i=0;i<m-2;i++)
                {
                    pf("%c",tmp[v++]);
                    v%=6;
                }
            }
        }
        if(n>=3)
        {
            int z = 0;
            char tmp[] = "abc";
            for(i=0;i<m;i++)
            {
                pf("%c",tmp[z++]);
                z%=3;
            }
        }
        blank;
    }
    return 0;

}

 

题目很简单,所以我觉得这题最重要的是打表,我把自己打的表贴一下:

思路是用二进制的0和1代替a,b,因为要字典序最小,所以从1111...一直遍历到0就行

int n,m;

char a[30];

bool isp(int x,int y)
{
    while(x<y)
    {
        if(a[x]!=a[y]) return false;
        x++;y--;
    }
    return true;
}

int gt()
{
    int len = strlen(a);
    int ans = 0;
    for(int i =0;i<len;i++)
    {
        for(int j = i;j<len;j++)
        {
            if(isp(i,j))
            {
                ans = max(ans,j-i+1);
            }
        }
    }
    return ans;
}

void get(int v)
{
    mem(a,0);
    int k = 0;
    int tmp = v;
    while(tmp)
    {
        tmp>>=1;
        k++;
    }
    while(v)
    {
        a[--k] = 'a' + 1-(v&1);
        v>>=1;
    }
}



int main()
{
    int t,kase=1,i,j,k;
    for(i=15;i>=0;i--)
    {
        int ans,cnt=100;
        int mx = pow(2,i);
        int mxx = pow(2,i+1);
        while(mx<mxx)
        {
            get(mxx);
            //pf("%s %d\n",a,gt());
            int tmp = gt();
            if(cnt>tmp)
            {
                ans = mxx;
                cnt = tmp;
            }
            mxx--;
        }
        get(ans);
        pf("%s %d\n",a,cnt);
        blank;
    }
    return 0;
}

 

posted @ 2016-08-05 15:35  qlky  阅读(195)  评论(0)    收藏  举报