题目链接:http://codeforces.com/contest/1028/problems
A. Find Square(水题)
题意:考虑一个大小为n×m的表,最初是全白色的。 行从上到下编号为1到n,从左到右编号为1到m列。 桌子内部的一些方形,边长为奇数,漆成黑色。 找到这个广场的中心。
题解:数据量并不是很大可以直接暴力找出有效坐标点求中间即可。
AC代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
int main(){
int n, m, l = 0, r = 0, u = 0, d = 0;
char arr[122][122];
memset(arr, 0, sizeof(arr));
scanf("%d%d", &n, &m);
for(int i = 1; i <= n; i++){
scanf("%s", arr[i]+1);
if(l == 0){
for(int j = 1; j <= m; j++){
if(arr[i][j] == 'B'){
l = j;
for(int k = j; k <= m; k++){
if(arr[i][k]!='B' || k == m){
r = k;
break;
}
}
break;
}
}
}
if(u == 0){
for(int j = 1; j <= m; j++){
if(arr[i][j] == 'B'){
u = i;
d = i;
break;
}
}
continue;
}
for(int j = 1; j <= m; j++){
if(arr[i][j] == 'B'){
d = i;
break;
}
}
}
cout << (u+d)/2 << " " << (l+r)/2 << endl;
return 0;
}
B. Unnatural Conditions
题意:存在一个函数S(x)。S(x)=x十进制下所有数字的和。给出数字n和m(1, <= n, m <= 1129),求a和b的值。满足下列条件:
- S(a) >= n
- S(b) >= n
- S(a+b)>=m
题解:细看发现这是一道思维题。虽然n和m一直在变化但大小限制在1129,因此我们只需要找出两个满足S(x)>=1129的值即可得到n在任意取值时都满足条件1和2,可以得出当x长度为1129且每一位都不为0时均满足条件。接着我们需要找到一个满足S(x)<=1的值即可得到m在任意取值时都满足条件3,可以得出当x为10的?次方时满足条件。
聪明的小伙伴大概已经看出来了,我们仅需两个长度均为1129且每一位都不为0的数,并且他们相加为10的1129次方即可满足任何情况。
AC代码:
#include<iostream>
#include<cstdio>
using namespace std;
int main(){
int n, m, Max = 0;
scanf("%d%d", &n, &m);
for(int i = 1; i <= 1129; i++) printf("1");
printf("\n");
for(int i = 1; i <= 1128; i++) printf("8");
printf("9\n");
return 0;
}
C. Rectangles
题意:比赛读题没仔细加上英语太菜读错题意浪费太多时间。题意是给出n个矩形的左下角和右上角,求出被(n-1)矩形覆盖的坐标(比赛前期读成求出被最多个矩形覆盖的坐标,之后就撕了一发离散化+线段树+扫描线结果TLE)
题解:正确题意知道后其实题目就没有那么困难了。用4个multiset和4个vector存储4个量。之后遍历一遍,每次在multiset去除一个矩阵,当右上角最小的x大于或等于左下角最大的x且右上角的y大于或等于左上角的y时即找到结果。
AC代码:
#include<iostream>
#include<cstdio>
#include<vector>
#include<set>
using namespace std;
int main(){
int n, l, r, u, d, x, y;
scanf("%d", &n);
vector<int> L, R, U, D;
multiset<int> LL, RR, UU, DD;
for(int i = 0; i < n; i++){
scanf("%d%d%d%d", &l, &d, &r, &u);
L.push_back(l), LL.insert(l);
D.push_back(d), DD.insert(d);
R.push_back(r), RR.insert(r);
U.push_back(u), UU.insert(u);
}
for(int i = 0; i < n; i++){
LL.erase(LL.find(L[i]));
DD.erase(DD.find(D[i]));
RR.erase(RR.find(R[i]));
UU.erase(UU.find(U[i]));
if(*RR.begin() >= *LL.rbegin() && *UU.begin() >= *DD.rbegin()){
x = *RR.begin();
y = *UU.begin();
break;
}
LL.insert(L[i]);
DD.insert(D[i]);
RR.insert(R[i]);
UU.insert(U[i]);
}
printf("%d %d", x, y);
return 0;
}
待补充~
还好没有掉分,可能是太弱原本分数太低了吧