贪心(Elegant Construction,HDU 5813)

很容易想到按ai排序。

然后ai>i就不行。

然后就往前面连,保证恰好能到达ai个点。

看了官方题解就是往前a[i]个点都连边就好了。

由于有向无环,所以不可能到达比a[i]大的点,而小于等于a[i]的点我们又全都到达了。


我只想到了一个比较复杂的方法,算法错了,又改才对了。

就是讨论,如果a[i]=a[i-1]+1,那就直接连到i-1

如果a[i]=a[i-1],那就跟i-1一样连。

否则一定存在足够多的入度为0的点,我们不连他们,但连其他所有的点。

一开始有些地方想错了,就是想得不够清楚,所以WA了挺久。

算法实现有些麻烦。


希望自己以后能想明白,一方面降低出错的可能,另一方面降低代码复杂度。

感觉自己贪心的题目总是讨论得很复杂,主要原因就是没想彻底,然后就着急着写了。


代码

#include
#include
#include
using namespace std;
typedef pair pii;
const int maxn = 1010;

vectorvec;
int N;
int a[maxn];
int r[maxn];
int v[maxn];
int vis[maxn];
int viss[maxn];
vectorG[maxn];

int cmp(int i,int j)
{
    return a[i]i) return false;
        if(a[r[i]]==a[r[i-1]])
            for(int j=0;j<(int)G[i-1].size();j++)
                add(i,G[i-1][j]);
        else if(a[r[i]]==a[r[i-1]]+1)
        {
            add(i,i-1);
            v[i-1]=0;
        }
        else
        {
            int num = i-a[r[i]];
            for(int j=1;j


你可能感兴趣的:(贪心)