A.UVALive 6661

  题意从1~N中选k个数,和为s的方案数

  第一眼搜索,估计错状态量,又去yydp...浪费大量时间

  数据很小的,状态数都不会超过2^N...直接dfs就过了

//state二进制表示选取的数

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

const int maxn = 200;

int N, S, K, cnt;

void dfs(int state, int k, int s, int start)
{
//    cout << k << ' ' << s << endl;
    if(k == 0 && s == 0) {
//        for(int i = 0; i < N; i++)
//            if(state&(1<<i))    cout << (i+1) << ' ';
//        cout << endl;
        cnt++;
    }
    if(k == 0)    return;
    for(int i = start; i < N; i++) {
        if(state&(1<<i))    continue;
        if(s < i+1)    break;
        dfs(state|(1<<i), k-1, s-(i+1), i+1);
    }
}

int main()
{
#ifdef LOCAL
    freopen("A.in", "r", stdin);
#endif
    while(scanf("%d%d%d", &N, &K, &S) != EOF) {
        if(N == 0 && K == 0)    break;
        cnt = 0;
        dfs(0, K, S, 0);
        printf("%d\n", cnt);
    }
    return 0;
}

 

B.UVALive 6662

  数据范围很小,直接模拟整个过程就行了。我是把长度、时间都×2,毕竟0.5不好处理。每隔1s计算所有蚂蚁位置,处理相交情况,标记走出通道。

#include <iostream>
#include <cstdio>
#include <cstdlib>
#include <cstring>

using namespace std;

const int maxn = 200+20;

int n, l, cnt, tcost, ans;
int p[maxn], dx[maxn];
bool done[maxn];

int main()
{
#ifdef LOCAL
    freopen("B.in", "r", stdin);
#endif
    while(scanf("%d%d", &n, &l) != EOF) {
        if(n == 0 && l == 0)    break;
        memset(done, 0, sizeof(done));
        cnt = 0;
        for(int i = 1; i <= n; i++) {
            int x;
            char dir;
            getchar();
            scanf("%c%d", &dir, &x);
            if(dir == 'R')    dx[i] = 1;
            else    dx[i] = -1;
            p[i] = x*2;
        }
        for(int t = 1; t <= 2*l; t++) {
            int lastone = 0;
            for(int i = 1; i <= n; i++) {
                if(done[i])    continue;
                p[i] += dx[i];
                if(p[i] == 0 || p[i] == 2*l) {
                    if(!lastone || p[i] == 0)    lastone = i;
                    done[i] = true;
                    cnt++;
                }
            }
            for(int i = 2; i <= 2*l; i++) {
                if(i % 2)    continue;
                int x = 0;
                for(int j = 1; j <= n; j++) {
                    if(done[j] || p[j] != i)    continue;
                    if(!x)    x = j;
                    else {
                        dx[x] *= -1;
                        dx[j] *= -1;
                    }
                }
            }
            if(cnt == n) {
                tcost = t;
                ans = lastone;
                break;
            }
        }
        //finish
        cout << tcost/2 << ' ' << ans << endl;
    }
    return 0;
}

 

  心态又开始崩了,A了两道就没有认真的看题了...不过这次剩下的题似乎都A不出来呢

posted on 2014-08-09 23:22  Gemmeg  阅读(142)  评论(0编辑  收藏  举报