LouZhang

导航

hdu_4300, hdu_4302, hdu_4308

这是12年多校的第一场

当时在做信安大赛,没有时间做

这两天补过来了

只会三题= =、而且还做了很久。。还是弱到爆啊

 

4300题就是一个简单的字符串模拟,不知道为什么两位队友为什么做了那么久了。。。

第一个串长26,相当于一个key了

第二个串是明文+密文,密文长度可能为0,前面一半绝对是明文

然后要你找出最短的明文

我就直接模拟过了,感觉要调BUG好久,不过真的就那么一搞就AC了

View Code
#include <cstdio>
#include <cstring>
#include <map>
#include <string>
#include <iostream>
using namespace std;

string s1, s2;
map < char, char > m;
int main()
{
    int tcase;
    scanf("%d", &tcase);
    while(tcase --)
    {
        cin>>s1>>s2;
        for(int i = 0, j = 'a'; s1[i]; i ++)
        {
            m[s1[i]] = j;
            //if(j == 'q') cout<<s1[i]<<endl;
            j ++;
        }
        if(s2.length() == 1)
        {
            printf("%c%c\n", s2[0], m[s2[0]]);
            continue;
        }
        int pos1 = 0;
        int pos2 = 0;
        int ans = s2.length();
        for(int i = (s2.length() + 1) / 2; i < s2.length(); i ++)
        {
            if(m[s2[0]] == s2[i])
            {
                pos1 = 1;
                int j;
                for(j = i + 1; s2[j]; j ++, pos1 ++)
                {
                    if(m[ s2[pos1] ] != s2[j])
                    {
                        break;
                    }
                }
                if(j < s2.length())
                {
                    i = j;
                }
                else
                {
                    ans = i;
                    break;
                }
            }
        }
        for(int i = 0; i < ans; i ++)
        printf("%c", s2[i]);
        for(int i = 0; i < ans; i ++)
        printf("%c", m[s2[i]]);
        puts("");
    }
    return 0;
}

4302题是一个线段树了

ZY给我讲的题,我没有看题

题意大概是:L表示总长,n表示数据组数,0后面接一数字表示在该位置放蛋糕,1表示吃掉离    他最近的蛋糕,最后求总长

网上的解题报告是用的模拟的,我用的线段树,而且出了一大堆错,最后就看着解题报告的标程    AC了= =

View Code
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;

#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1

const int maxn = 100000 + 10;
int sum[maxn<<2];
int max_[maxn<<2];
int min_[maxn<<2];
const int inf = ~0U>>1;

void build(int l, int r, int rt){
    //if(l > r)
    //return;
    sum[rt] = 0;
    max_[rt] = -inf;
    min_[rt] = inf;
    if(l == r){
        return;
    }
    int m = l + r >> 1;
    build(lson);
    build(rson);
}
void update(int num, int e, int l, int r, int rt){
    if( num < l || num > r) return;
    if(l == r){
        sum[rt] += e;
        if(sum[rt])
          max_[rt] = min_[rt] = num;
        else{
            max_[rt] = -inf;
            min_[rt] = inf;
        }
        return;
    }
    int m = l + r >> 1;
    update(num, e, lson);
    update(num, e, rson);
    max_[rt] = max(max_[rt<<1], max_[rt<<1|1]);
    min_[rt] = min(min_[rt<<1], min_[rt<<1|1]);
}
int find_max(int a, int b, int l, int r, int rt){
    if(b < l || a > r  ) return -inf;
    if(a <= l && b >= r)
      return max_[rt];
    int m = l + r >> 1;
    return max(find_max(a, b, lson), find_max(a, b, rson));
}
int find_min(int a, int b, int l, int r, int rt){
    if(b < l || a > r  ) return inf;
    if(a <= l && b >= r)
      return min_[rt];
    int m = l + r >> 1;
    return min(find_min(a, b, lson), find_min(a, b, rson));
}

int main(){
    int tcase;
    int z = 1;
    scanf("%d", &tcase);
    while(tcase --){
        int L, n;
        scanf("%d%d", &L, &n);
        build(0, L, 1);
        int now = 0;
        int ans = 0;
        int dir = 1;
        //puts("asdf");
        while(n --){
            //printf("n  %d", n   );
            int a, b;
            scanf("%d", &a);
            if(a == 0){
                scanf("%d", &b);
                update(b, 1, 0, L, 1);
                continue;
            }
            int l = find_max(0, now, 0, L, 1);
            int r = find_min(now, L, 0, L, 1);
            //printf("---  %d  %d\n", l, r);
            if(l <= -inf && r >= inf)
              continue;
            else
              if(l <= -inf)
                ans += r - now, now = r, dir = 1;
              else
                if(r >= inf)
                  ans += now - l, now = l, dir = 0;
                else
                  if(now - l < r - now)
                    ans += now - l, now = l, dir = 0;
                  else
                    if(now - l > r - now)
                      ans += r - now, now = r, dir = 1;
                    else
                      if(dir)
                        ans += r - now, now = r, dir = 1;
                      else
                        ans += now - l, now = l, dir = 0;
                        //printf("ans:   %d\n", ans);
            update(now, -1, 0, L, 1);
        }
        printf("Case %d: %d\n", z++, ans);
    }
    return 0;
}

4308题最坑人了

昨天做的时候,把P全连通给看错了

我以为是走到一个P然后隔一格跳过去

太想当然了

这样的话,如果P全连通,最短路来做确实方便

不过我一开始就用的BFS

所以最后还是在BFS上改的

一走到P然后就把所有的P加入到队列当中

用的优先队列

不知道为什么过不了==

最后看蛋蛋哥队友的代码

改了一下写法,也就是在完全BFS之后再返回一个值了

这样就行了,这个真的学习了Orz

View Code
#include<cstdio>
#include<queue>
#include<cstring>

using namespace std;
struct point{
    int x, y;
    int sum;
};
bool flag[5000 + 10][5000 + 10];
int r, c, cost;
char map[5000 + 10][5000 + 10];
int dir[4][2] = {
    1, 0,
    -1, 0,
    0, 1,
    0, -1
};
int count_;
int xx[5000 + 10];
int yy[5000 + 10];
int bfs(point start, point end){
    queue < point > q;
    q.push(start);
    int ans = -1;
    int flag1 = 0;
    while(!q.empty()){
        point tmp = q.front();
        q.pop();
        for(int i = 0; i < 4; i ++){
            int x = tmp.x + dir[i][0];
            int y = tmp.y + dir[i][1];
            if(x < 0 || x >= r || y < 0 || y >= c){
                continue;
            }
            if(x == end.x && y == end.y){
                //return tmp.sum;
                if(tmp.sum < ans || ans == -1)
                    ans = tmp.sum;
                continue;
            }
            if(map[x][y] == '#')
              continue;
            if(flag[x][y] == 1)
              continue;
            point now;
            now.x = x;
            now.y = y;
            now.sum = tmp.sum;
            if(map[x][y] == '*'){
                flag[x][y] = 1;
                now.sum = tmp.sum + cost;
                q.push(now);
            }
            if(map[x][y] == 'P'){/*
                if(y + 2 < c && map[x][y + 2] == 'P'){
                    flag[x][y + 2] = 1;
                    now.y = y + 2;
                    q.push(now);
                }
                if(y - 2 >= 0 && map[x][y - 2] == 'P'){
                    flag[x][y - 2] = 1;
                    now.y = y - 2;
                    q.push(now);
                }
                if(x + 2 < r && map[x + 2][y] == 'P'){
                    flag[x + 2][y] = 1;
                    now.x = x + 2;
                    q.push(now);
                }
                if(x - 2 >= 0 && map[x - 2][y] == 'P'){
                    flag[x - 2][y] = 1;
                    now.x = x - 2;
                    q.push(now);
                }*/
                if(flag1 == 1) continue;
                flag1 = 1;
                for(int j = 0; j < count_; j ++){
                    now.x = xx[j];
                    now.y = yy[j];
                    flag[now.x][now.y] = 1;
                    q.push(now);
                }
            }
        }
    }
    //return -1;
    return ans;
}
int main(){
    while(~scanf("%d%d%d", &r, &c, &cost)){
        for(int i = 0; i < r; i ++){
            scanf("%s", map[i]);
        }
        point start, end;
        memset(flag, 0, sizeof(flag));
        count_ = 0;
        for(int i = 0; i < r; i ++){
            for(int j = 0; j < c; j ++){
                if(map[i][j] == 'Y'){
                    start.x = i;
                    start.y = j;
                    flag[i][j] = 1;
                }
                if(map[i][j] == 'C'){
                    end.x = i;
                    end.y = j;
                }
                if(map[i][j] == 'P'){
                    xx[count_] = i;
                    yy[count_ ++] = j;
                }
            }
        }
        start.sum = 0;
        int f = bfs(start, end);
        if(f == -1)
          puts("Damn teoy!");
        else
          printf("%d\n", f);
    }
    return 0;
}

 

就记到这里了,下午多校第二场,求RP了

posted on 2012-07-26 11:14  louzhang_swk  阅读(626)  评论(0编辑  收藏  举报