Task 11

T1

题目大意:

5元, 10元, 20元排队买书, 给定顺序, 求能否处理

简单分析:

直接模拟

标算:
#include<cstdio>
int a[2], n, x;
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) {
        scanf("%d", &x);
        if(x == 5) a[0]++;
        if(x == 10) {
            if(a[0]>0) a[0]--;
            else {
                printf("NO\n");
                return 0;
            }
            a[1]++;
        }
        if(x == 20) {
            if(a[1]>0 && a[0]>0) a[0]--, a[1]--;
            else if(a[0]>2) a[0]-=3;
            else {
                printf("NO\n");
                return 0;
            }
        }
    }
    printf("YES\n");
    return 0;
}

T2

题目大意:

n个函数, 给出几个出口的位置, 问是否是一个可能的序列

简单分析:

括号匹配, 直接模拟

标算:

数组z是个栈

#include<cstdio>
const int N = 1e6 + 10;
int a[N], z[N], n, m, x, p;
int main() {
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) scanf("%d", &a[i]);
    scanf("%d", &m);
    for(int i = 1; i <= m; ++i) {
        scanf("%d", &x);
        if(a[x]>0) a[x] = -a[x];
    }
    for(int i = n; i >= 1; --i) {
        if(a[i] > 0) {
            if(z[p] == -a[i]) p--;
            else {
                a[i] = -a[i];
                p++;
                z[p] = a[i];
            }
        } else {
            p++;
            z[p] = a[i];
        }
    }
    if(p == 0) {
        for(int i = 1; i <= n; ++i) {
            if(a[i] > 0) printf("+%d ", a[i]);
            else printf("%d ", a[i]);
        }
    } else printf("NO\n");
    return 0;
}

T3

不可做的题目大意:

迷宫是由 n 个交叉口和 m 条路径构成(路径为无向边),路径上有门和钥匙,对应的门需要用对应的钥匙来开门。他们决定使用贪心的方式走过迷宫,每次路过一条边一定会捡起边上的钥匙(钥匙多不坏事?),并把钥匙存在栈里,钥匙被捡起后会刷新。遇到一个门,他们就会从栈中拿起一个钥匙开门。钥匙开门后会消失。小 l 想知道从 a 是否能够成功的从 A 岔路口走到 B 岔路口,而且到 B 时栈为空。

用命分析:

Floyed
F[i][j][k]表示从i到j能否以k的方式到达。
K = 括号完全匹配 或者 缺少一个右括号

咋都看不懂的标算:
#include<cstdio>
const int N = 100 + 10;
int n, m, x, y, z, t, g[N][N][40], q[N*N*40][3], sta;
int main() {
    scanf("%d%d", &n, &m);
    t = 0;
    for(int i = 1; i <= m; ++i) {
        scanf("%d%d%d", &x, &y, &z);
        if(z) {
            if(z < 0) z = -z;
            else z += 10;
            g[x][y][z] = g[y][x][z] = 1;
        } else {
            g[x][y][z] = g[y][x][z] = 1;
            ++t;
            q[t][0] = x; q[t][1] = y; q[t][2] = 0;
            ++t;
            q[t][0] = y; q[t][1] = x; q[t][2] = 0;
        }
    }
    for(int i = 1; i <= n; ++i) {
        g[i][i][0] = 1;
        ++t;
        q[t][0] = i; q[t][1] = i; q[t][2] = 0;
    }
    for(int s = 1; s <= t; ++s) {
        x = q[s][0]; y = q[s][1]; sta = q[s][2];
        if(sta) {
            for(int i = 1; i <= n; ++i) {
                if(g[i][x][sta-10] == 1) {
                    if(g[i][y][0] == 0) {
                        g[i][y][0] = 1;
                        ++t;
                        q[t][0] = i; q[t][1] = y; q[t][2] = 0;
                    }
                }
            }
        } else {
            for(int i = 1; i <= n; ++i) {
                if(g[i][x][0] == 1 && g[i][y][0] == 0) {
                    g[i][y][0] = 1;
                    ++t;
                    q[t][0] = i; q[t][1] = y; q[t][2] = 0;
                }
                if(g[y][i][0] == 1 && g[x][i][0] == 0) {
                    g[x][i][0] = 1;
                    ++t;
                    q[t][0] = x; q[t][1] = i; q[t][2] = 0;
                }
                for(int j = 1; j <= 10; ++j) {
                    if(g[y][i][j] == 1 && g[x][i][j+20] == 0) {
                        g[x][i][j+20] = 1;
                        ++t;
                        q[t][0] = x; q[t][1] = i; q[t][2] = j+20;
                    }
                }
            }
        }
    }
    int tt = 0;
    scanf("%d", &tt);
    while(tt--) {
        scanf("%d%d", &x, &y);
        if(g[x][y][0] == 1) printf("YES\n");
        else printf("NO\n");
    }
    return 0;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值