青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品

隨筆-14  評論-8  文章-0  trackbacks-0

     題目及解題程序給在末尾,先來看看排列一個數(shù)組的方法。

     給定一個數(shù)組 array[] = {3, 1, 2, 4, 0}; 這個給定的數(shù)組有目的性,即它符合 n * m 的規(guī)則,這里是 5 * 5(5個元素,5個連續(xù)且不同的值)。按我想到的一般的方法,就是使用循環(huán)來求出各種排列的可能,但這種方法不能確保每個元素只出現(xiàn)一次,且隨著元素個數(shù)的增長,循環(huán)深度將變得很深。繼續(xù)想下去,這種方法將會變得很復(fù)雜,這就要求我尋找另外一種方法。注意到每個元素并不相同,那么要使各個元素在每個位置上只出現(xiàn)一次,很明顯的一種方法就是“彩票機讀票法”。比如數(shù)據(jù)讀入口在第一個元素的位置,那么依次循環(huán)這個數(shù)組,每次使后面的元素向前移動一位,各個數(shù)字不就都讀到了嗎,這就像在打印機中滾動的紙。具體步驟如下:

31240
12403 <—rotate

     第一位如此,那么后面的每一位也如此,也就是遞歸地處理后面的數(shù)字,每移動一位就以下一位為起點做相同的處理,直到所有數(shù)字循環(huán)了一遍,那排列的工作也就完成了。一個具體的實現(xiàn)如下:

/*
 * @param r:     需要求其排列的向量
 * @param iPos:  當(dāng)前所進行到的位置
 * 程序體中的注釋表示處于那個位置的向量都是一個新的且唯一的排列
*/
void rotate(vector<int>& r, int iPos) {

    if(iPos == r.size() - 1)//是否循環(huán)完畢,調(diào)用函數(shù)時 iPos 置0
        return;

    int iNextPos = iPos + 1;
    for(size_t i = iPos; i < r.size(); ++i) {
        if(i == 0) {
            //a different permutation, do something here
        }

        int t = r[iPos];
        for(size_t j = iPos; j < r.size() - 1; ++j)//循環(huán)前移
            r[j] = r[j + 1];
        r[r.size() - 1] = t;

        if(i != r.size() - 1) {
            //a different permutation, do something here
        }

        rotate(r, iNextPos);//從下一位數(shù)字開始新的位移
    }
}
   這種方法不要求數(shù)字式連續(xù)的,也不用事先規(guī)定好向量的長度。只是當(dāng)向量長度到了一定的時候,運算時間會很長!其它方法未知……
   topcoder 上的練習(xí)題如下:

Problem Statement

A permutation A[0], A[1], ..., A[N-1] is a sequence containing each integer between 0 and N-1, inclusive, exactly once. Each permutation A of length N has a corresponding child array B of the same length, where B is defined as follows:
B[0] = 0
B[i] = A[B[i-1]], for every i between 1 and N-1, inclusive.
A permutation is considered perfect if its child array is also a permutation.  Below are given all permutations for N=3 with their child arrays. Note that for two of these permutations ({1, 2, 0} and {2, 0, 1}) the child array is also a permutation, so these two permutations are perfect.
Permutation        Child array
{0, 1, 2}        {0, 0, 0}
{0, 2, 1}        {0, 0, 0}
{1, 0, 2}        {0, 1, 0}
{1, 2, 0}        {0, 1, 2}
{2, 0, 1}        {0, 2, 1}
{2, 1, 0}        {0, 2, 0}
You are given a vector <int> P containing a permutation of length N. Find a perfect permutation Q of the same length such that the difference between P and Q is as small as possible, and return this difference. The difference between P and Q is the number of indices i for which P[i] and Q[i] are different.
Definition

Class:
PerfectPermutation
Method:
reorder
Parameters:
vector <int>
Returns:
int
Method signature:
int reorder(vector <int> P)
(be sure your method is public)

Constraints
-
P will contain between 1 and 50 elements, inclusive.
-
P will contain each integer between 0 and N-1, inclusive, exactly once, where N is the number of elements in P.
Examples

0)
{2, 0, 1}
Returns: 0
P is a perfect permutation, so we can use the same permutation for Q. The difference is then 0 because P and Q are the same.

1)
{2, 0, 1, 4, 3}
Returns: 2
Q might be {2, 0, 3, 4, 1}.

2)
{2, 3, 0, 1}
Returns: 2
Q might be {1, 3, 0, 2}.

3)
{0, 5, 3, 2, 1, 4}
Returns: 3

4)
{4, 2, 6, 0, 3, 5, 9, 7, 8, 1}
Returns: 5

This problem statement is the exclusive and proprietary property of TopCoder, Inc. Any unauthorized use or reproduction of this information without the prior written consent of TopCoder, Inc. is strictly prohibited. (c)2003, TopCoder, Inc. All rights reserved.

    我的解答如下:
#include <iostream>
#include <vector>
#include <cstddef>
#include <limits>
#include <cassert>

#include <boost\assign.hpp>    // for vector +=

using namespace std;

class PerfectPermutation {
public:
    int  reorder(const vector<int>& P, vector<int>& result);
    bool isPerfect(const vector<int>& P);

private:
    int  difference(const vector<int>& P, const vector<int>& Q);
    void rotate(const vector<int>& src, vector<int>& r, int level, int& nMin, vector<int>& out);
};

int PerfectPermutation::difference(const vector<int>& P, const vector<int>& Q) {

    size_t cDiff = P.size();
    assert(cDiff == Q.size());

    for(size_t i = 0; i < P.size(); ++i) {
        if(P[i] == Q[i])
            cDiff--;
    }

    return cDiff;
}

bool PerfectPermutation::isPerfect(const vector<int>& A) {

    int Bi = 0, Bi_1 = 0;
    vector<bool> vb(A.size());
    vb[0] = true;

    for(size_t i = 1; i < A.size(); ++i) {
        if(vb[Bi = A[Bi_1]])
            return false;
        else
            vb[Bi] = true;

        Bi_1 = Bi;
    }

    return true;
}

void PerfectPermutation::rotate(const vector<int>& src, vector<int>& r, int level, int& nMin, vector<int>& out) {

    if(level == r.size() - 1)
        return;

    int in = level + 1;
    for(size_t i = level; i < r.size(); ++i) {
        if(i == 0 && isPerfect(r)) {
            nMin = min(difference(src, r), nMin);
            out = r;
        }

        int t = r[level];
        for(size_t j = level; j < r.size() - 1; ++j)
            r[j] = r[j + 1];
        r[r.size() - 1] = t;

        if((i != r.size() - 1) && isPerfect(r)) {
            nMin = min(difference(src, r), nMin);
            out = r;
        }

        rotate(src, r, in, nMin, out);
    }
}

int PerfectPermutation::reorder(const vector<int>& P, vector<int>& result) {

    if(P.size() == 1 || isPerfect(P))
        return 0;

    int nMin = numeric_limits<int>::max();

    vector<int> Q(P);

    rotate(P, Q, 0, nMin, result);

    return nMin == numeric_limits<int>::max() ? -1 : nMin;
}
int main() {

    using namespace boost::assign;

    PerfectPermutation pp;

    vector<int> P;
    P += 2, 0, 1, 4, 3;
    vector<int> result(P.size());

    cout << "Is a perfect Permutation :                    " << (pp.isPerfect(P) ? "Yes" : "No") << endl;
    cout << "Difference between before reorder and after : " << pp.reorder(P, result) << endl;
    assert(pp.isPerfect(result));
    cout << "One answer might be :                         ";
    for(size_t i = 0; i < result.size(); ++i)
        cout << result[i] << " ";
    cout << endl;

    return 0;
}
posted on 2009-12-19 20:53 崇文 閱讀(2116) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導(dǎo)航: 博客園   IT新聞   BlogJava   博問   Chat2DB   管理


青青草原综合久久大伊人导航_色综合久久天天综合_日日噜噜夜夜狠狠久久丁香五月_热久久这里只有精品
  • <ins id="pjuwb"></ins>
    <blockquote id="pjuwb"><pre id="pjuwb"></pre></blockquote>
    <noscript id="pjuwb"></noscript>
          <sup id="pjuwb"><pre id="pjuwb"></pre></sup>
            <dd id="pjuwb"></dd>
            <abbr id="pjuwb"></abbr>
            亚洲综合成人婷婷小说| 美女网站久久| 在线中文字幕一区| 欧美天天综合网| 久久久久免费视频| 欧美视频一区二区三区…| 欧美午夜精品久久久久久人妖 | 欧美在线精品免播放器视频| 国产精品视频导航| 久久乐国产精品| 久久综合999| 日韩午夜激情电影| 亚洲午夜久久久| 国内精品久久久久久影视8| 免费h精品视频在线播放| 欧美va亚洲va日韩∨a综合色| 99亚洲视频| 亚洲一区二区三区精品在线观看| 国产日韩在线一区| 欧美成人一区二区三区| 欧美美女日韩| 久久成人人人人精品欧| 久久综合亚洲社区| 亚洲综合欧美日韩| 久久久夜夜夜| 亚洲一级免费视频| 久久久成人网| 一区二区激情| 久久精品女人天堂| 亚洲网址在线| 久久偷窥视频| 欧美在线视频a| 欧美成人免费在线观看| 欧美一区二区三区四区高清| 免费成人高清视频| 久久精品国产免费观看| 欧美日韩久久| 欧美在线一级va免费观看| 久久精品国产清高在天天线| 亚洲图片欧美午夜| 嫩草国产精品入口| 久久亚洲不卡| 国产噜噜噜噜噜久久久久久久久| 亚洲国产精品成人精品| 国产日韩欧美一区二区三区四区| 亚洲精品在线一区二区| 亚洲黄色在线观看| 欧美综合国产| 久久不射2019中文字幕| 欧美日韩在线视频首页| 亚洲国产精品久久久久婷婷884| 国产热re99久久6国产精品| 亚洲精品在线观看免费| 亚洲国产第一| 久久久久久久久久久久久女国产乱 | 亚洲一二三四久久| 一区二区免费在线视频| 欧美成人国产| 亚洲第一精品电影| 亚洲电影专区| 老鸭窝毛片一区二区三区| 久久视频免费观看| 国内精品久久久久久影视8| 亚洲欧美在线一区| 久久国产精品久久久| 国产精品久久久久久久久久妞妞 | 欧美a级片一区| 亚洲大片免费看| 久久久在线视频| 蜜臀av性久久久久蜜臀aⅴ四虎 | 免费欧美网站| 亚洲高清中文字幕| 亚洲精品免费在线播放| 欧美电影在线| 99精品国产热久久91蜜凸| 在线视频你懂得一区| 欧美日韩一区二区三区免费看| 日韩一级片网址| 亚洲欧美日韩一区在线观看| 国产精品乱码一区二区三区| 亚洲欧美激情视频| 久久亚洲精品中文字幕冲田杏梨| 极品av少妇一区二区| 免费在线日韩av| 夜夜嗨av一区二区三区| 欧美一区二区精品久久911| 国产日韩精品综合网站| 久久久久一本一区二区青青蜜月| 欧美电影免费观看高清完整版 | 国产精品国产三级国产专播精品人| 一本久久综合亚洲鲁鲁| 欧美尤物巨大精品爽| 激情视频一区| 欧美日韩福利| 午夜精品久久久久| 欧美国产先锋| 香蕉久久精品日日躁夜夜躁| 狠狠噜噜久久| 欧美日韩视频专区在线播放 | 免费在线欧美黄色| 99精品国产在热久久下载| 国产精品久久国产愉拍 | 亚洲欧洲另类| 久久精品国产成人| 亚洲国产精品久久久久久女王| 欧美色道久久88综合亚洲精品| 欧美一级片一区| 亚洲精品视频一区| 久久精品亚洲精品国产欧美kt∨| 亚洲区一区二| 国产区亚洲区欧美区| 欧美激情精品久久久久久久变态| 亚洲欧美三级在线| 亚洲人体一区| 蜜臀av在线播放一区二区三区| 亚洲一区观看| 亚洲精品婷婷| 伊人婷婷欧美激情| 国产免费一区二区三区香蕉精| 欧美激情久久久久久| 久久精品国产99精品国产亚洲性色| 亚洲乱亚洲高清| 亚洲国产第一页| 久久久国产成人精品| 亚洲伊人久久综合| 一本久道久久综合婷婷鲸鱼| 激情综合久久| 黑丝一区二区三区| 国产精品自在线| 国产精品久久二区| 欧美特黄视频| 欧美小视频在线| 欧美日韩福利视频| 欧美激情中文不卡| 欧美国产国产综合| 免费不卡在线视频| 免费不卡视频| 欧美gay视频激情| 美女主播一区| 暖暖成人免费视频| 蜜桃av一区二区在线观看| 久久久午夜电影| 久久久噜噜噜久噜久久| 久久久xxx| 久久综合九色综合网站| 久久久噜噜噜久久中文字免| 久久久久国产免费免费| 久久久蜜桃一区二区人| 久久另类ts人妖一区二区 | 99精品视频免费全部在线| 亚洲全部视频| 一区二区三区不卡视频在线观看 | 欧美不卡在线| 亚洲第一视频网站| 亚洲国产午夜| 一区二区三区四区国产| 亚洲尤物在线| 欧美中在线观看| 噜噜噜噜噜久久久久久91| 欧美大片免费久久精品三p| 欧美风情在线观看| 欧美视频第二页| 国产精品天美传媒入口| 国产一区二区三区日韩欧美| 狠狠综合久久av一区二区小说| 又紧又大又爽精品一区二区| 亚洲精品一区在线| 亚洲一区二区在线| 久久久久一本一区二区青青蜜月| 美女脱光内衣内裤视频久久影院 | 你懂的网址国产 欧美| 亚洲国产天堂久久综合网| 亚洲精品在线视频| 欧美在线观看一区| 欧美第十八页| 国产精品综合色区在线观看| 在线观看亚洲精品视频| 中文亚洲视频在线| 久久精品视频在线看| 欧美电影免费观看网站| 洋洋av久久久久久久一区| 欧美在线地址| 欧美日韩一区三区| 狠狠色伊人亚洲综合网站色| 日韩午夜在线视频| 久久久久久久一区二区| 亚洲欧洲综合另类| 久久成人一区| 欧美午夜电影在线观看| 亚洲国产天堂久久国产91| 午夜一区二区三区在线观看| 欧美激情亚洲精品| 欧美一区二区日韩| 欧美日本在线观看| 在线看片欧美| 久久久999国产| 亚洲香蕉伊综合在人在线视看| 欧美www视频| 红桃视频一区| 欧美亚洲免费在线|