CodeforcesRound#551(Div. 2)(A-C题解)

本文提供CodeForces比赛1153题目的解析与代码实现,涵盖车辆选择、积木堆叠、括号匹配及未解决的D题。通过详细步骤展示如何处理复杂的数据结构和算法挑战。

http://codeforces.com/contest/1153/problem/A

题意:有n辆车,有一个人从第m站上车。接下来n行,每行两个数a,b代表有一路车第一站到a站,然后每隔b站停一次。问你这个人会上哪个车。输出任意答案即可。

思路:数据1e5,直接标记会到的站点暴力跑就可以了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 int a[100005];
 6 int d[100005];
 7 int p[300005];
 8 int main(){
 9     cin >> n >> m;
10     memset(p,0,sizeof(p));
11     for(int i = 1;i <= n;i ++){
12         cin >> a[i] >> d[i];
13         int t = a[i];
14         while(t <= 300000){
15             p[t] = i;
16             t += d[i];
17         }
18     }
19     for(int i = m;i <= 300000;i ++){
20         if(p[i] != 0){
21             cout << p[i] << endl;
22             break;
23         }
24     }
25 
26     return 0;
27 }
A

 

 

http://codeforces.com/contest/1153/problem/B

题意:第一行三个数代表某种由1*1*1的积木搭成的一个形状的长宽高。第二行m个数代表正视图的每个格子有多高。第三行n个数为左视图的每隔各自有多高。下面n*m个数代表俯视图的每个格子是否有积木。

   输出n*m个数代表俯视图,不过要输出每个点的有几块积木。输出任意答案即可。

思路:ans[i][j] = min(front[j],left[i])。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m,k;
 5 int fr[105];
 6 int lf[105];
 7 int top[105][105];
 8 int ans[105][105];
 9 int main(){
10     cin >> n >> m >> k;
11     memset(ans,0,sizeof(ans));
12     for(int i = 1;i <= m;i ++){
13         cin >> fr[i];
14     }
15     for(int i = 1;i <= n;i ++){
16         cin >> lf[i];
17     }
18     for(int i = 1;i <= n;i ++){
19         for(int j = 1;j <= m;j ++){
20             cin >> top[i][j];
21         }
22     }
23     for(int i = 1;i <= n;i ++){
24         for(int j = 1;j <= m;j ++){
25             if(top[i][j]){
26                 ans[i][j] = min(lf[i],fr[j]);
27             }
28         }
29     }
30     for(int i = 1;i <= n;i ++){
31         for(int j = 1;j <= m;j ++){
32             if(j != 1){cout << " ";}
33             cout << ans[i][j];
34         }cout << endl;
35     }
36 
37 
38 
39     return 0;
40 }
B

 

 

http://codeforces.com/contest/1153/problem/C

题意:给一串只含有'(',')','?'的字符串,你要将问好换成左右括号,问你全部将问号填上之后,会不会形成一个所有前缀串的括号都不匹配,但是全串的括号匹配的串。

思路:很明显,初始串长度必须为偶数,左右括号数量不能超过串长的一半(这条卡了我两发,有点蠢)。然后贪心填写左括号直到左括号用完。最后判断就行了。

 1 #include <bits/stdc++.h>
 2 using namespace std;
 3 
 4 int n,m;
 5 char in[300005];
 6 int main(){
 7     cin >> n;
 8     scanf("%s",in);
 9     if(n % 2){cout << ":(" << endl;return 0;}
10     int left = 0;
11     int right = 0;
12     for(int i = 0;i < n;i ++){
13         if(in[i] == '('){left ++;}
14         if(in[i] == ')'){right ++;}
15     }
16     left = n / 2 - left;
17     if(left < 0){cout << ":(" << endl;return 0;}
18     if(right > n / 2){cout << ":(" << endl;return 0;}
19     for(int i = 0;i < n;i ++){
20         if(in[i] == '?'){
21             if(left){
22                 in[i] = '(';
23                 left --;
24             }
25             else{
26                 in[i] = ')';
27             }
28         }
29     }
30     //printf("%s\n",in);
31     int f = 1,cnt = 0;
32     for(int i = 0;i < n;i ++){
33         if(in[i] == '('){
34             cnt ++;
35         }
36         else{
37             if(cnt){
38                 cnt --;
39                 if(cnt == 0 && i != n - 1){
40                     f = 0;
41                 }
42             }
43             else{
44                 f = 0;
45             }
46         }
47     }
48     if(f){
49         printf("%s\n",in);
50     }
51     else{
52         cout << ":(" << endl;
53     }
54 
55     return 0;
56 }
C

 

 

http://codeforces.com/contest/1153/problem/D

D题留坑,感觉是有一种方式最优的,还没想到

转载于:https://www.cnblogs.com/love-fromAtoZ/p/10704080.html

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符  | 博主筛选后可见
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值