As usual, Alice finishes her delicious cake at noon. Unfortunately, the smell of cake beckoned hungry Bob, and he decided to rob one piece of cake.
The cake is a convex polygon with N edges. At the beginning, Bob cut it along the diagonals. After M cuts, Bob decided to rob the 'largest' piece of cake. Strangely, in Bob's opinion, the piece has the most number of edge is the biggest one.
Please help Bob to find the 'largest' piece.
Input
There are multiple test cases (about 20).
The first line of each test case contains two integer number N, M (5 <= N <= 10000), indicating the number of point of the cake and the cut, respectively.
The following M lines contain two integer x, y (1 <= x, y <= N), denoting the index of the starting and ending cut point. (the index of points mark from 1 to N clockwise.)
The input will guarantee that all of the cuts will not intersect inside the cake, but they may cross each other at the edge of cake, and Bob won't cut along the initial edge of the cake.
Output
Output the maximal size (most number of edges) of the piece which Bob will get.
Sample Input
7 2 3 6 7 2
Sample Output
4
// 还没想通
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define N 20010
using namespace std;
struct data
{
int l, r, s;
data(int _l, int _r, int _s) : l(_l),r(_r),s(_s){}
data(){}
}d[N];
bool cmp(data a, data b)
{
return a.s < b.s;
}
int next[N], n, m;
int main()
{
while (scanf("%d%d", &n, &m)!= EOF)
{
int x, y;
for (int i = 1; i < 2 * n; ++i)
next[i] = i + 1;
next[2 * n] = 1;
for (int i = 1; i <= m; ++i)
{
scanf("%d%d", &x, &y);
if (x > y) swap(x, y);
int l = y - x + 1;
if (l > n - l + 2)//?
{
int temp = x; x = y; y = temp + n;
l = n - l;
}
d[i] = data(x, y, l);
}
sort(d + 1, d + 1 + m, cmp);
int res = 0, sum = n;
for (int i = 1; i <= m; ++i)
{
int l = 0, s = d[i].l;
while (s != d[i].r)
{
s = next[s], l++;
}
res = max(res, l + 1);
sum -= (l - 1);
next[d[i].l] = d[i].r;
if ((d[i].l <= n) && (d[i].r <= n)) next[d[i].l + n] = d[i].r + n;
else next[d[i].l + n] = d[i].r - n;
}
res = max(res, sum);
printf("%d\n", res);
}
return 0;
}
本文介绍了一个有趣的算法问题:如何帮助角色Bob找到被切割后的蛋糕中边数最多的碎片。通过输入多组测试用例,每组包含蛋糕顶点数量及切割次数,文章详细解释了算法的实现过程。

被折叠的 条评论
为什么被折叠?



