• 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("!
    ")
    #define MAXN 100000 +5
    #define MAX(a,b) a>b?a:b
    #define blank pf("
    ")
    #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
    ",a,gt());
                int tmp = gt();
                if(cnt>tmp)
                {
                    ans = mxx;
                    cnt = tmp;
                }
                mxx--;
            }
            get(ans);
            pf("%s %d
    ",a,cnt);
            blank;
        }
        return 0;
    }
  • 相关阅读:
    BETA 版冲刺前准备
    alpha事后诸葛亮
    alpha冲刺10
    alpha冲刺9
    alpha冲刺8
    alpha冲刺7
    alpha冲刺6
    alpha冲刺5
    第十一次作业
    Alpha冲刺一 (10/10)
  • 原文地址:https://www.cnblogs.com/qlky/p/5741573.html
Copyright © 2020-2023  润新知