Codeforces Round #325 (Div. 2) 586ABC题解

46 篇文章 0 订阅
34 篇文章 0 订阅

题目链接:点击打开链接


A: 给出Alena的课表, 1代表有课, 0代表没课, 2个连续0以上可以回家休息, 问你一天在学校待多久.

直接模拟即可, 可以直接计算1, 101的数目. 我记录了开头的1和结尾的1, 然后减去2个连续0以上的个数就是答案.

AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 105;
int n, a[MAXN];
int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for(int i = 0; i < n; ++i)
        scanf("%d", &a[i]);
    int st = -1, ed = -1;
    for(int i = 0; i < n; ++i) {
        if(a[i] && st == -1) st = i;
        if(a[i]) ed = i;
    }
    if(st == -1) {
        printf("0\n");
        return 0;
    }
    if(ed == -1) {
        printf("1\n");
        return 0;
    }
    int num = 0;
    for(int i = st + 1; i < ed; ++i) {
        if(!a[i]) {
            int x = 1;
            for(int j = i + 1; j < ed; ++j)
                if(!a[j]) x++;
                else break;
            if(x == 1) continue;
            else {
                num += x;
                i += x;
            }
        }
    }
    printf("%d\n", ed - st + 1 - num);
    return 0;
}


B: 给你一个地图, 给出两点之间的距离, 问你从左上角到右下角再回左上角的最短路径(不能相同)是多少.

小小的脑洞, 记录n条路径的总长, 然后排序输出最短的两条和即可.

AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 60;
int a1[MAXN], a2[MAXN], b[MAXN], n, ans, dis[MAXN];
int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for(int i = 1; i < n; ++i)
        scanf("%d", &a1[i]);
    for(int i = 1; i < n; ++i)
        scanf("%d", &a2[i]);
    for(int i = 1; i <= n; ++i)
        scanf("%d", &b[i]);
    for(int i = 1; i <= n; ++i) {
        for(int j = 1; j < i; ++j)
            dis[i] += a1[j];
        for(int j = i; j <= n - 1; ++j)
            dis[i] += a2[j];
        dis[i] += b[i];
    }
    sort(dis + 1, dis + n + 1);
    printf("%d\n", dis[1] + dis[2]);
    return 0;
}


C: n个孩子去看牙医, 每个孩子有三个数据描述, 分别是诊断时发出的声音v, 无法承受他人声音时发出的声音d, 以及承受他人声音的

能力p. 当孩子诊断时, 后面一个人听到v - 1的声音, 再后面一个v - 2.. 如果超过自己的承受能力d, 就会向队尾跑去, 伴随着声音p, 同时

也可能会超过其他排队孩子的承受能力, 导致其他孩子跑去队尾.

还是模拟, 要注意用long long, 并且每个孩子听到声音后, 承受能力会减少听到的响应音量.

AC代码:

#include "iostream"
#include "cstdio"
#include "cstring"
#include "algorithm"
using namespace std;
const int MAXN = 4005;
typedef long long ll;
int n, ans;
struct node
{
    /* data */
    ll v, d, p;
}a[MAXN];
int main(int argc, char const *argv[])
{
    scanf("%d", &n);
    for(int i = 1; i <= n; ++i) 
        scanf("%lld%lld%lld", &a[i].v, &a[i].d, &a[i].p);
    for(int i = 1; i <= n; ++i) {
        if(a[i].p >= 0) {
            ll e = 0;
            for(int j = i + 1; j <= n; ++j)
                if(a[j].p >= 0) {
                    a[j].p -= a[i].v + e;
                    if(a[j].p < 0) e += a[j].d;
                    if(a[i].v) a[i].v--;
                }
            ans++;
        }
    }
    printf("%d\n", ans);
    for(int i = 1; i <= n; ++i)
        if(a[i].p >= 0) printf("%d ", i);
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值