Qualification Round 2020 - Code Jam 2020 BC题解

本文介绍了两道算法题目的解题思路。第一题是'思维NestingDepth',要求根据数字串生成最短括号嵌套字符串;第二题是'ParentingPartneringReturns',涉及任务分配问题,需要确保两个人的时间不冲突。解题方法分别是通过贪心策略,按数字差值输出括号和直接贪心分配任务。
摘要由CSDN通过智能技术生成

试了一下去年的题,tcl,前三道其实不难但是这个就恰好难到了我orz。

思维 Nesting Depth

Nesting Depth

题目大意

给定一个数字组成的串,输出一个最短的串,使得每个数字 d d d 都被 d d d 个括号嵌套。

如:

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXCMi1fx-1616753245341)(https://i.loli.net/2021/03/26/dqIUYkCNZJ42SxG.png)]

解题思路

按照相邻两个数的差值输出括号。

参考代码

#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<stack>
//#define LOCAL  //提交时一定注释
#define VI vector<int>
#define eps 1e-6
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
const int N = 1e2 + 10;
#define ls rt << 1
#define rs rt << 1 | 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
inline int readint() {int x; scanf("%d", &x); return x;}


int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
//   freopen("output.txt", "w", stdout);
#endif
    int t = readint();
    for(int ca = 1; ca <= t; ++ca) {
        printf("Case #%d: ", ca);
        string s; cin >> s;
        int f = s[0] - '0';
        int dep = f;
        for(int i = 0; i < f; ++i) {
            printf("(");
        }
        for(int i = 0; i + 1 < s.length(); ++i) {
            printf("%c", s[i]);
            int d = s[i] - s[i + 1];
            dep -= d;
            if (d > 0) {
                for(int j = 0; j < d; ++j) printf(")");
            }
            else {
                for (int j = 0; j < -d; ++j) {
                    printf("(");
                }
            }
        }
        printf("%c", s.back());
        for(int i = 0; i < dep; ++i) printf(")");
        printf("\n");
    }
    return 0;
}

贪心 Parenting Partnering Returns

Parenting Partnering Returns

题目大意

给定一些任务,有起始时间,分配给两个人。每个人自己做任务时时间不能重叠。

解题思路

直接贪心地分配即可,判断两个人能不能做,可以的话更新一下当前的结束时间,如果两人都不行,则退出。

参考代码

#include<stdio.h>
#include<iostream>
#include<vector>
#include<cstring>
#include<cstdio>
#include<climits>
#include<cmath>
#include<algorithm>
#include<queue>
#include<deque>
#include<map>
#include<unordered_map>
#include<set>
#include<unordered_set>
#include<stack>
//#define LOCAL  //提交时一定注释
#define VI vector<int>
#define eps 1e-6
#define io ios::sync_with_stdio(false); cin.tie(0); cout.tie(0)
using namespace std;
typedef long long LL;
typedef double db;
const int inf = 0x3f3f3f3f;
const LL INF = 1e18;
const int N = 1e3 + 10;
#define ls rt << 1
#define rs rt << 1 | 1
#define lson l, mid, rt << 1
#define rson mid + 1, r, rt << 1 | 1
inline int readint() {int x; scanf("%d", &x); return x;}

struct node{
    int s, e, id;
    bool operator < (const node &y) const{
        return s < y.s;
    }
}s[N];

char ans[N];

bool vis[N];

void init() {
    memset(ans, 0, sizeof(ans));
}
int main() {
#ifdef LOCAL
    freopen("input.txt", "r", stdin);
//   freopen("output.txt", "w", stdout);
#endif
    int t = readint();
    for(int ca = 1; ca <= t; ++ca) {
        init();
        printf("Case #%d: ", ca);
        int n = readint();
        for(int i = 0; i < n; ++i) {
            s[i].s = readint();
            s[i].e = readint();
            s[i].id = i;
        }
        sort(s, s + n);
        int c = 0, j = 0;
        bool flag = true;
        for(int i = 0; i < n; ++i) {
            if (s[i].s >= c) {
                c = s[i].e;
                ans[s[i].id] = 'C';
            }
            else if (s[i].s >= j) {
                j = s[i].e;
                ans[s[i].id] = 'J';
            }
            else {
                flag = false;
                break;
            }
        }
        if (!flag) {
            printf("IMPOSSIBLE\n");
            continue;
        }
        puts(ans);
    }
    return 0;
}
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值