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

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

SRE实战 互联网时代守护先锋,助力企业售后服务体系运筹帷幄!一键直达领取阿里云限量特价优惠。

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

CodeforcesRound#551(Div. 2)(A-C题解) 随笔 第1张
 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])。

CodeforcesRound#551(Div. 2)(A-C题解) 随笔 第3张
 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

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

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

CodeforcesRound#551(Div. 2)(A-C题解) 随笔 第5张
 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题留坑,感觉是有一种方式最优的,还没想到

扫码关注我们
微信号:SRE实战
拒绝背锅 运筹帷幄