• 组队练习赛(Regionals 2012, North America


    A.Babs' Box Boutique

    给定n个盒子,每个盒子都有长宽高(任意两个盒子长宽高不完全相同),现在选盒子的任意两面,要求x1 <= x2 && y1 <= y2,问最多能选多少盒子满足这需求。

    直接dfs暴搞................

    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <iostream>
    #include <cmath>
    #include <algorithm>
    #include <map>
    # define INF 0x7FFFFFFF
    using namespace std;
    int vis[11];
    struct node {
        int a[3];
    }p[11];
    int ans,n;
    int dx[] = {0,0,1};
    int dy[] = {1,2,2};
    //bool cmp(int a,int b) {
    //    return a > b;
    //}
    
    void dfs(int step,int x,int y) {
        if(step > ans) ans = step;
        if(step == n) return ;
        for(int i=0; i<n; i++) {
            if(vis[i] == 1) continue;
    
            for(int j=0; j<3; j++) {
                int xx = p[i].a[dx[j]];
                int yy = p[i].a[dy[j]];
                if(xx >= x && yy >= y ) {
                    vis[i] = 1;
                    dfs(step + 1,xx,yy);
                    vis[i] = 0;
                }
            }
        }
    }
    
    int main() {
        int casee = 1;
        while(scanf("%d",&n) && n) {
            if(n == 0) break;
            int tmp[3];
            for(int i=0; i<n; i++) {
                scanf("%d%d%d",&tmp[0],&tmp[1],&tmp[2]);
                sort(tmp,tmp+3);
                p[i].a[0] = tmp[0];
                p[i].a[1] = tmp[1];
                p[i].a[2] = tmp[2];
            }
            ans = 0;
            memset(vis,0,sizeof(vis));
            dfs(0,0,0);
            printf("Case %d: %d
    ",casee++,ans);
        }
        return 0;
    }


    C.Hexagon Perplexagon

    题意就不写了:戳这

    dfs暴搞,每一层传入三个参数,层数, 每一块需要匹配的前驱点,和最后一块需要匹配的点..........

    #include <iostream>
    #include <stdio.h>
    #include <cstring>
    #include <cmath>
    #include <algorithm>
    #include <vector>
    #include <queue>
    using namespace std;
    int map[8][8];
    int ans[8];
    int save[8];
    int vis[8];
    int n,ok;
    
    void change(int x,int pos) {
        int i;
        for(i=0; i<6; i++) {
            if(map[x][i] == pos) break;
        }
        pos = i;
        int cnt = 0;
        for(int i=0; i<6; i++) {
            save[cnt++] = map[x][pos];
            pos ++;
            if(pos >= 6) pos -= 6;
        }
    }
    
    int getpre(int pos,int t) {
        t --;
        if(t < 0) t = 5;
        return map[pos][t];
    }
    
    int getsuc(int pos,int t) {
        t ++;
        if(t > 5) t = 0;
        return map[pos][t];
    }
    
    void dfs(int step,int p1,int p2) {
        if(step == 7) return ;
        if(ok == 1) return ;
        for(int i=0; i<7; i++) {
            if(vis[i] == 1) continue;
            int j;
            for(j=0; j<6; j++) {
                if(map[i][j] == save[step-1]) break;
            }
            int tmp1 = getpre(i,j);
            int tmp2 = getsuc(i,j);
            if(step == 1) {
                ans[step] = i;
                vis[i] = 1;
                dfs(step + 1,tmp1,tmp2);
                vis[i] = 0;
            }
            if(step > 1 && step < 6) {
                if(tmp2 == p1 ) {
                    ans[step] = i;
                    vis[i] = 1;
                    dfs(step+1,tmp1,p2);
                    vis[i] = 0;
                }
            }
            if(step == 6) {
                if(tmp2 == p1 && tmp1 == p2 ) {
                    ans[step] = i;
                    ok = 1;
                }
            }
            if(ok == 1) return ;
        }
    }
    int main() {
        int T;
        cin >> T;
        int casee = 1;
        while(T --) {
            for(int i=0; i<7; i++) {
                for(int j=0; j<6; j++) {
                    scanf("%d",&map[i][j]);
                }
            }
            ok = 0;
            for(int i=0; i<7; i++) {
                memset(vis,0,sizeof(vis));
                vis[i] = 1;
                change(i,1);
                ans[0] = i;
                dfs(1,0,0);
                if(ok) break;
            }
            printf("Case %d: ",casee++);
            if(ok == 0) {
                printf("No solution
    ");
                continue;
            }
            printf("%d",ans[0]);
            for(int i=1; i<7; i++) {
                printf(" %d",ans[i]);
            }
            puts("");
        }
        return 0;
    }


    D.I've Got Your Back(gammon)

    暴搞,每一种排列分别保存它的各个点的情况,并且用map保存每种排列的顺序下标


    #include <cstdio>
    #include <cstring>
    #include <string>
    #include <iostream>
    #include <cmath>
    #include <map>
    using namespace std;
    struct node
    {
        int pos[10];
    } p[20000];
    
    map <string,int>mm;
    int cnt ;
    string str = "";
    string str2 = "";
    string change(int x)
    {
        str = "";
        str2 = "";
        if(x == 0)
        {
            str += '0';
            return str;
        }
        int cn = 0;
        while(x)
        {
            int t = x % 10;
            str += t + '0';
            x = x / 10;
        }
        int len = str.length();
        for(int i=len-1; i>=0; i--) str2 += str[i];
        str2 += '';
        return str2;
    }
    void init()
    {
        cnt = 0;
        for(int i=0; i<=15; i++)
        {
            for(int j=0; j<=15; j++)
            {
                for(int k=0; k<=15; k++)
                {
                    for(int l=0; l<=15; l++)
                    {
                        for(int x=0; x<=15; x++)
                        {
                            for(int y=0; y<=15; y++)
                            {
                                int t = i + j + k + l + x + y;
                                if(t > 15) break;
                                if(t == 15)
                                {
                                    string tmp;
                                    p[cnt].pos[0] = i;
                                    p[cnt].pos[1] = j;
                                    p[cnt].pos[2] = k;
                                    p[cnt].pos[3] = l;
                                    p[cnt].pos[4] = x;
                                    p[cnt].pos[5] = y;
                                    tmp += change(i);
                                    tmp += ' ';
                                    tmp += change(j);
                                    tmp += ' ';
                                    tmp += change(k);
                                    tmp += ' ';
                                    tmp += change(l);
                                    tmp += ' ';
                                    tmp += change(x);
                                    tmp += ' ';
                                    tmp += change(y);
    
                                    mm[tmp] = cnt;
                                    cnt ++;
                                }
                            }
                        }
                    }
                }
            }
        }
    }
    
    int n;
    int main()
    {
        init();
        char c;
        int a,b,d,e,f,g;
        int casee = 1;
        while(cin >> c)
        {
            if(c == 'e') break;
            printf("Case %d: ",casee++);
            if(c == 'm')
            {
                scanf("%d%d%d%d%d%d",&a,&b,&d,&e,&f,&g);
                string tmp;
                tmp += change(a);
                tmp += ' ';
                tmp += change(b);
                tmp += ' ';
                tmp += change(d);
                tmp += ' ';
                tmp += change(e);
                tmp += ' ';
                tmp += change(f);
                tmp += ' ';
                tmp += change(g);
                //cout << tmp << endl;
                printf("%d
    ",mm[tmp]);
            }
            if(c == 'u')
            {
                scanf("%d",&a);
                printf("%d",p[a].pos[0]);
                for(int i=1; i<6; i++)
                {
                    printf(" %d",p[a].pos[i]);
                }
                puts("");
            }
        }
        return 0;
    }



  • 相关阅读:
    Hdu4547CD操作离线lca
    1036: [ZJOI2008]树的统计Count树链剖分
    light1348Aladdin and the Return Journey树链剖分
    Problem 2082 过路费树链剖分
    2243: [SDOI2011]染色树链剖分
    Poj3237Tree 树链剖分
    Poj2763Housewife Wind树链剖分
    Hdu5087Revenge of LIS II简单dp
    Hdu5088Revenge of Nim II高斯消元
    Bootstrap入门学习笔记(只记录了效果)
  • 原文地址:https://www.cnblogs.com/james1207/p/3283529.html
Copyright © 2020-2023  润新知