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

隨筆-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ù)想下去,這種方法將會變得很復雜,這就要求我尋找另外一種方法。注意到每個元素并不相同,那么要使各個元素在每個位置上只出現(xiàn)一次,很明顯的一種方法就是“彩票機讀票法”。比如數(shù)據(jù)讀入口在第一個元素的位置,那么依次循環(huán)這個數(shù)組,每次使后面的元素向前移動一位,各個數(shù)字不就都讀到了嗎,這就像在打印機中滾動的紙。具體步驟如下:

31240
12403 <—rotate

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

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

    if(iPos == r.size() - 1)//是否循環(huán)完畢,調用函數(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ī)定好向量的長度。只是當向量長度到了一定的時候,運算時間會很長!其它方法未知……
   topcoder 上的練習題如下:

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 崇文 閱讀(2107) 評論(0)  編輯 收藏 引用

只有注冊用戶登錄后才能發(fā)表評論。
網(wǎng)站導航: 博客園   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>
            久久久久99精品国产片| 欧美日本高清| 久久成人久久爱| 久久久999国产| 欧美电影在线免费观看网站 | 亚洲女同性videos| 欧美尤物一区| 亚洲国产成人在线播放| 亚洲老板91色精品久久| 亚洲午夜精品网| 久久人体大胆视频| 一区二区三区成人精品| 久久精品亚洲一区| 亚洲激情偷拍| 欧美一区网站| 久久婷婷综合激情| 国产精品毛片高清在线完整版| 国产日韩欧美精品| aⅴ色国产欧美| 久色成人在线| 在线视频中文亚洲| 欧美精品激情| 亚洲高清一区二| 久久国产天堂福利天堂| 夜夜嗨av一区二区三区四区| 欧美在线免费观看视频| 国产精品久久国产三级国电话系列 | 美女999久久久精品视频| 国产九九视频一区二区三区| 一区二区三区视频在线看| 欧美高清视频在线| 欧美一区二区三区精品| 国产精品久久一级| 欧美成人午夜激情在线| 国产精品wwwwww| 日韩一级免费| 99re6热在线精品视频播放速度| 久久在线免费| 亚洲国产天堂久久综合网| 一区二区三区国产在线观看| 合欧美一区二区三区| 久久精品国产亚洲精品| 欧美精品一区二区三区一线天视频| 新67194成人永久网站| 亚洲免费在线观看视频| 国产精品国产三级国产专区53| 美日韩精品免费| 免费看的黄色欧美网站| 99在线精品视频| 久久久久一区二区三区| 亚洲国产精品高清久久久| 午夜精品一区二区三区在线播放 | 久久精品国产免费| 亚洲欧美日韩国产| 欧美性视频网站| 亚洲精品影院| 国产精品免费看片| 99精品国产在热久久| 亚洲人成网站在线观看播放| 夜夜爽99久久国产综合精品女不卡| 在线成人av.com| 欧美激情免费观看| 欧美区亚洲区| 亚洲国内精品在线| 国产精品黄视频| 99国产精品久久久久久久| 亚洲欧洲综合| 欧美精品激情blacked18| 欧美激情一区二区三区蜜桃视频| 在线看欧美日韩| 日韩视频在线一区| 99在线视频精品| 欧美日韩免费高清一区色橹橹| 午夜免费在线观看精品视频| 久久精品国产免费| 蜜桃伊人久久| 亚洲福利精品| 欧美久久九九| 一本到12不卡视频在线dvd| 亚洲视频一区二区在线观看| 久久久久久久久久久成人| 美玉足脚交一区二区三区图片| 在线观看成人小视频| 欧美福利视频在线观看| 久久精品成人欧美大片古装| 国产欧美精品一区| 亚洲国产三级| 亚洲午夜电影| 国产一二精品视频| 一区二区三区av| 久久精品99国产精品日本| 一区二区三区在线观看欧美| 亚洲尤物影院| 亚洲视频精选| 国产日产高清欧美一区二区三区| 欧美中文在线免费| 欧美激情一区二区三区在线视频| 夜夜嗨av一区二区三区| 国产欧美精品xxxx另类| 另类欧美日韩国产在线| 99精品热视频只有精品10| 久久久成人精品| 99视频国产精品免费观看| 国产精品综合视频| 欧美高清不卡| 午夜在线一区| 日韩亚洲欧美高清| 亚洲一区3d动漫同人无遮挡| 国产亚洲欧洲一区高清在线观看 | 亚洲精品综合| 看片网站欧美日韩| 一区二区三区欧美在线| 狠狠综合久久| 国产精品二区在线| 你懂的成人av| 欧美伊人影院| 国产精品99久久久久久宅男| 欧美成人午夜免费视在线看片| 午夜精品亚洲| 日韩网站在线| 亚洲国产精品专区久久| 国产婷婷色一区二区三区在线| 欧美日产一区二区三区在线观看| 欧美r片在线| 亚洲国产精品女人久久久| 国产精品美女久久久久久免费 | 亚洲无线一线二线三线区别av| 一区二区不卡在线视频 午夜欧美不卡在 | 亚洲乱码国产乱码精品精可以看| 国产在线成人| 久热精品在线视频| 性伦欧美刺激片在线观看| 国产精品99久久久久久白浆小说| 免费欧美日韩国产三级电影| 欧美在线日韩在线| 精品91在线| 国产亚洲欧美色| 国产精品视频精品| 久久久久高清| 久久国产一区| 久久精品亚洲乱码伦伦中文| 午夜久久tv| 欧美一区二区日韩| 亚洲欧美美女| 欧美一区二区精品在线| 午夜在线视频观看日韩17c| 欧美一级视频免费在线观看| 亚洲免费中文| 午夜宅男欧美| 久久九九有精品国产23| 久久精品在线视频| 久久久91精品国产一区二区三区 | 久热精品视频在线观看一区| 久久亚洲午夜电影| 欧美成人精品在线播放| 欧美岛国在线观看| 欧美久久一级| 欧美视频二区| 久久综合五月天婷婷伊人| 老司机午夜精品视频在线观看| 久久综合狠狠综合久久综青草| 免费观看久久久4p| 欧美日韩精品在线观看| 国产精品日本精品| 国产精品自拍一区| 一区二区三区在线观看国产| 亚洲精品久久在线| 国产一区二区三区在线观看网站| 国产亚洲一级高清| 亚洲韩日在线| 亚洲深爱激情| 久久视频精品在线| 一本色道久久综合亚洲精品不| 亚洲一区免费观看| 亚洲区在线播放| 在线一区二区三区四区五区| 午夜一区二区三区不卡视频| 蜜桃av噜噜一区| 99国产精品久久久久老师| 亚洲欧美激情一区二区| 六十路精品视频| 国产精品久久久久久福利一牛影视 | 欧美日韩国产片| 国产精品亚洲综合| 91久久精品一区二区三区| 中日韩高清电影网| 久久五月天婷婷| 99视频精品全国免费| 久久亚洲视频| 国产模特精品视频久久久久| 亚洲精品1区2区| 久久国产精品毛片| 日韩一二在线观看| 久久久久久久尹人综合网亚洲| 欧美日韩国产成人高清视频| 国产亚洲在线观看| 午夜精品福利一区二区三区av| 欧美91福利在线观看| 亚洲小说区图片区| 欧美久久久久|