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 }
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 }
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 ",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 ",in); 50 } 51 else{ 52 cout << ":(" << endl; 53 } 54 55 return 0; 56 }
http://codeforces.com/contest/1153/problem/D
D题留坑,感觉是有一种方式最优的,还没想到