试了一下去年的题,tcl,前三道其实不难但是这个就恰好难到了我orz。
思维 Nesting Depth
题目大意
给定一个数字组成的串,输出一个最短的串,使得每个数字 d d d 都被 d d d 个括号嵌套。
如:
![[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-bXCMi1fx-1616753245341)(https://i.loli.net/2021/03/26/dqIUYkCNZJ42SxG.png)]](https://i-blog.csdnimg.cn/blog_migrate/804534df735878682a77d6df7841d622.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
题目大意
给定一些任务,有起始时间,分配给两个人。每个人自己做任务时时间不能重叠。
解题思路
直接贪心地分配即可,判断两个人能不能做,可以的话更新一下当前的结束时间,如果两人都不行,则退出。
参考代码
#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;
}
本文介绍了两道算法题目的解题思路。第一题是'思维NestingDepth',要求根据数字串生成最短括号嵌套字符串;第二题是'ParentingPartneringReturns',涉及任务分配问题,需要确保两个人的时间不冲突。解题方法分别是通过贪心策略,按数字差值输出括号和直接贪心分配任务。
218

被折叠的 条评论
为什么被折叠?



