A - Overturned Numbers URAL - 2031
思路:先列举1-99所有符合题意的数,翻转后排序,之后判断是否有符合n的连续序列,符合的话翻转(按翻转前从大到小的顺序!!!)输出。
#include <iostream>
#include <algorithm>
#include <cstring>
using namespace std;
int p[99]; //储存翻转数
int main()
{
int numi = 4;
p[0] = 10; p[1] = 90; p[2] = 80; p[3] = 60;
for (int i = 11; i < 100; ++i)
{
int baiwei=i/10;
int gewei=i%10;
if ((baiwei == 1 ||baiwei == 6 ||baiwei == 8 ||baiwei == 9 ||baiwei == 0 )&&( gewei == 1 ||gewei == 6 ||gewei == 8 ||gewei == 9 ||gewei == 0))
{
if (baiwei == 6) baiwei = 9;
else if (baiwei == 9) baiwei = 6;
if (gewei == 6) gewei = 9;
else if (gewei == 9) gewei = 6;
int a = baiwei;
baiwei = gewei;
gewei = a;
p[numi++] = baiwei * 10 + gewei;
}
}
sort(p, p + numi );
int n;
cin >> n;
int ans[99]; int start = 6;
int N = 1; ans[0] = 6; int judge = 0;
for (int i = 1; i < numi; ++i)
{
if (N == n)
{
judge = 1;
break;
}
if (p[i] == start + N)
{
ans[N] = p[i];
++N;
}
else
{
start = p[i];
ans[0] = start;
N = 1;
}
}
if (judge == 1)
{
for (int i = n-1; i >=0; --i) //注意逆序输出
{
if (ans[i] == 1) cout << 10;
else if (ans[i] == 6) cout << 90;
else if (ans[i] == 9) cout << 60;
else if (ans[i] == 8) cout << 80;
else
{
int baiwei = ans[i] / 10;
int gewei = ans[i] % 10;
if (baiwei == 6) baiwei = 9;
else if (baiwei == 9) baiwei = 6;
if (gewei == 6) gewei = 9;
else if (gewei == 9) gewei = 6;
int a = baiwei;
baiwei = gewei;
gewei = a;
int x= baiwei * 10 + gewei;
if (x < 10) cout << 0 << x;
else cout << x;
}
if (i != 0) cout << ' ';
}
}
else
{
cout << "Glupenky Pierre";
}
}
D - The E-pang Palace HDU - 5128
思路:矩形有两种符合题意的位置关系:相离,包含(边缘不重合)(这是一个坑!!!),相离的面积为两者之和,包含的面积为大矩形的面积!!!
ac代码:
#include <iostream>
#include <algorithm>
using namespace std;
int map[205][205];
int p[100][2];
struct rectangle
{
int l, r, u, d;
}q[100];
int main()
{
int n;
while (cin >> n, n)
{
int a, b;
memset(q, 0, sizeof(q));
memset(map, 0, sizeof(map));
for (int i = 0; i < n; ++i)
{
cin >> a >> b;
map[a][b] = 1;
p[i][0] = a;
p[i][1] = b;
}
int N = 0;
for (int i = 0; i < n; ++i) //任取两个点判断能否构成矩形//会出现重复情况,故N比实际大,无影响
{
for (int t = 0; t < n; ++t)
{
if (p[i][0] != p[t][0]&&p[i][1]!=p[t][1])
{
if (map[p[i][0]][p[t][1]] == 1 && map[p[t][0]][p[i][1]] == 1) //能构成矩形//注意别写成map[p[i][0]][p[t][1]] == 1 && map[p[i][1]][p[t][0]] == 1
{
// cout << p[i][0] << ' ' << p[i][1] << " " << p[t][0] << ' ' << p[t][1] << endl;//test
q[N].r = max(p[i][0], p[t][0]); q[N].l = min(p[i][0], p[t][0]);
q[N].d = max(p[i][1], p[t][1]); q[N].u = min(p[i][1], p[t][1]);//cout << q[N].l << q[N].r << q[N].u << q[N].d << endl;
++N;
}
}
}
}
if (N < 2) cout << "imp" << endl;
else
{
int sum = 0;
for (int i = 0; i < N-1; ++i) //任取两个矩形判断是否符合题意
{
for (int t = i + 1; t < N; ++t)
{
int map2[205][205];
memset(map2, 0, sizeof(map2));
for (int j = q[i].u; j <= q[i].d; ++j) //构图//
{
for (int v = q[i].l; v <= q[i].r; ++v)
{
// map2[j][v]++;
if (j == q[t].u || j == q[t].d) map2[j][v]++;
if (((v == q[t].l) || v == q[t].r)&&j != q[t].u&&j != q[t].d) map2[j][v]++;
}
}
for (int j = q[t].u; j <= q[t].d; ++j) //构图//
{
for (int v = q[t].l; v <= q[t].r; ++v)
{
// map2[j][v]++;
if (j == q[t].u || j == q[t].d) map2[j][v]++;
if (((v == q[t].l) || v == q[t].r) && j != q[t].u&&j != q[t].d) map2[j][v]++;
}
}
/* cout << endl; //test
for (int j = q[i].u; j <= q[i].d; ++j) //test
{
for (int v = q[i].l; v <= q[i].r; ++v)
{
if((v == q[i].l) ||( v == q[i].r) ||( j == q[i].u )||( j == q[i].d))
cout << map2[j][v] << ' ';
else cout << " ";
}cout << endl;
}cout << endl;*/
int judge = 1;
for (int j = q[i].u; j <= q[i].d; ++j) //判断是否相交或重合
{
for (int v = q[i].l; v <= q[i].r; ++v)
{
// if (j == q[i].a || j == q[i].c || v == q[i].a || v == q[i].c)
{
if ((((v == q[i].l) || v == q[i].r) || j == q[i].u||j == q[i].d)&&map2[j][v] ==2)
{
judge = 0;
break;
}
}
}
if (judge == 0) break;
}
if (judge == 1)
{
int tempsum;
int qisum = (q[i].d - q[i].u)*(q[i].r - q[i].l);
int qtsum = (q[t].d - q[t].u)*(q[t].r - q[t].l);
if ((q[i].l > q[t].l&&q[i].r<q[t].r&&q[i].u>q[t].u&&q[i].d < q[t].d) || (q[i].l < q[t].l&&q[i].r > q[t].r&&q[i].u < q[t].u&&q[i].d > q[t].d)) //包含的情况
tempsum = max(qisum, qtsum);
else tempsum = (q[i].d - q[i].u)*(q[i].r - q[i].l ) + (q[t].d - q[t].u )*(q[t].r - q[t].l );
if (tempsum > sum) sum = tempsum;
}
}
}
if (sum == 0) cout << "imp" << endl;
else cout << sum << endl;
}
}
}