bnu 34982 Beautiful Garden(暴力)

题目链接:bnu 34982 Beautiful Garden

题目大意:给定一个长度为n的序列,问说最少移动多少点,使得序列成等差序列,点的位置能够为小数。

解题思路:算是纯暴力吧。枚举等差的起始和中间一点,由于要求定中间一点的位置。所以这一步是o(n3);然后用o(n)的算法确定说须要移动几个来保证序列等差。

#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>

using namespace std;
const int N = 1e5+5;

bool flag;
int n, m, c, mv, f[N], r[N], ans[N];
vector<int> g[N];

int getfar(int x) {
    return x == f[x] ? x : f[x] = getfar(f[x]);
}

void init () {
    scanf("%d%d", &n, &m);

    flag = false;
    for (int i = 0; i <= n; i++)
        r[i] = f[i] = i;
    for (int i = 0; i < m; i++)
        g[i].clear();

    int t;
    for (int i = 0; i < m; i++) {
        scanf("%d", &t);
        int a, pre = 0;

        for (int j = 0; j < t; j++) {
            scanf("%d", &a);
            g[i].push_back(a);
            if (a < pre)
                flag = true;
            pre = a;
        }
    }
}

bool insert (int x, int d) {

    for (int j = mv-1; j >= 0; j--) {
        if (g[d][j] < x) {
            int p = getfar(g[d][j]);
            f[p] = x;
            r[p] = x;
            mv = j;
            return true;
        }
    }
    return false;
}

void put(int x) {
    ans[c--] = x;
    if (r[x] != x)
        put(r[x]);
}

void solve () {

    for (int i = m-1; i; i--) {
        int t = g[i].size();

        mv = g[i-1].size();

        for (int j = t-1; j >= 0; j--)
            if (!insert(g[i][j], i-1)) {
                flag = true;
                return;
            }
    }

    c = n;
    int t = g[0].size();
    for (int i = t-1; i >= 0; i--)
        put(g[0][i]);
}

int main () {
    int cas;
    scanf("%d", &cas);
    for (int i = 1; i <= cas; i++) {
        init ();

        printf("Case #%d: ", i);
        solve();

        if (flag) {
            printf("No solution\n");
        } else {
            for (int j = 1; j < n; j++)
                printf("%d ", ans[j]);
            printf("%d\n", ans[n]);
        }
    }
    return 0;
}

版权声明:本文博主原创文章,博客,未经同意不得转载。

时间: 2024-10-29 19:11:36

bnu 34982 Beautiful Garden(暴力)的相关文章

bnu 34982 Beautiful Garden

Beautiful Garden There are n trees planted in lxhgww's garden. You can assume that these trees are planted along the X-axis, and the coordinate of ith tree is xi. But in recent days, lxhgww wants to move some of the trees to make them look more beaut

BNUOJ 34982 Beautiful Garden

BNUOJ 34982 Beautiful Garden 题目地址:BNUOJ 34982 题意: 看错题意纠结了好久... 在坐标轴上有一些树,现在要重新排列这些树,使得相邻的树之间间距相等. 刚开始瞄了一眼以为是求最短的移动距离...后来发现是求最少去移动的树的数量. 分析: 刚开始想错了,以为任意取两棵树,作为相邻的两棵树就行了,吃了好多个wa后,发现这个有问题,因为考虑里面三棵树为最终序列中的三个,那么就有可能判断不出来. 于是想了新的方法,枚举两棵树后,再枚举中间有几棵树,在两棵树中间

北京邀请赛 B. Beautiful Garden

题意:给你坐标和n个点,求最少移动的点使得n个点成等差数列 思路:既然要成等差数列,那么最起码有两个点是不动的,然后枚举这两个点中间的点的个数,最近水的要死,看了队友的代码做的 #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> #include <cstdlib> #include <cmath> using namespace

2014 SummerTrain Beautiful Garden

There are n trees planted in lxhgww's garden. You can assume that these trees are planted along the X-axis, and the coordinate of ith tree is xi. But in recent days, lxhgww wants to move some of the trees to make them look more beautiful. lxhgww will

2014 BNU 邀请赛B题(枚举)

Beautiful Garden 题意:x轴上放了一些树,现在要移动一些树使得所有树都等间距,问最少要移动多少棵 思路:枚举,枚举第一棵树,和另一棵树,以及中间有多少树,这样就能知道等差数列的首项和公差,然后再循环一边计算出答案,保存最小值 代码: #include <stdio.h> #include <string.h> #include <algorithm> #include <math.h> using namespace std; #define

hdu 5977 Garden of Eden

Garden of Eden Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 581    Accepted Submission(s): 164 Problem Description When God made the first man, he put him on a beautiful garden, the Garden

hdu-5977 Garden of Eden(树分治)

题目链接: Garden of Eden Time Limit: 10000/5000 MS (Java/Others)    Memory Limit: 131072/131072 K (Java/Others)Total Submission(s): 210    Accepted Submission(s): 75 Problem Description When God made the first man, he put him on a beautiful garden, the G

2014北京邀请赛(部分题解)

马上要去比赛了. 今天做了一下2014北京邀请赛,出了两道题目,感觉很水啊... 首先H题: H. Happy Reversal Time Limit: 1000ms Case Time Limit: 1000ms Memory Limit: 65536KB 64-bit integer IO format: %lld      Java class name: Main Submit Status PID: 34988 Font Size:  +   - Elfness is studying

2014 北京邀请赛ABDHJ题解

A. A Matrix 点击打开链接 构造,结论是从第一行开始往下产生一条曲线,使得这条区间最长且从上到下递减, #include <cstdio> #include <cstring> #include <algorithm> #include <iostream> #include <stdio.h> #include <vector> #include <set> using namespace std; #defi