传送门:HDU6150
以上来自:点击打开链接
想了很久都不明白贪心的做法为什么一定把右边的当做解,重新看了一眼题,发现
if (deg[i] >= mx) { mx = deg[i]; u = i; }注意是>=,也就是说,度数相等的情况下选择较大的编号,而我们构造的图中右边的编号又一定大于左边的。。
这样做出来假设左边有n个点,右边会有nlogn个点,我们要保证nlogn > 3n。
代码:
#include<bits/stdc++.h>
#define ll long long
#define inf 0x3f3f3f3f
using namespace std;
typedef pair<int,int> P;
const int MAXN = 100010;
P p[MAXN];
int main()
{
/*int sum = 0;
for(int i = 1; i <= 30; i++)
sum += 30 / i;
cout << sum;*/
int l = 30, r = 31, cnt = 0;
for(int i = 1; i <= l; i++)
{
for(int j = 1; j + i <= l + 1; j += i)
{
for(int k = j; k < j + i; k++)
p[cnt++] = P(k, r);
r++;
}
}
printf("%d %d\n", r - 1, cnt);
for(int i = 0; i < cnt; i++)
printf("%d %d\n", p[i].first, p[i].second);
printf("%d\n", 30);
for(int i = 1; i <= l; i++)
printf("%d\n", i);
return 0;
}