[SOJ1006] Team Rankings
生活随笔
收集整理的這篇文章主要介紹了
[SOJ1006] Team Rankings
小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
用枚舉法實(shí)現(xiàn)
代碼如下:
//我是先用全排列生成了全部的串,再寫的
全排列生成代碼,點(diǎn)擊可看
枚舉的時(shí)候用了減枝,所以可能會(huì)稍微快點(diǎn)
但是emmm
看完師兄們的解法只需要0.00sec之后,我這個(gè)0.02sec的菜雞就不知道該說什么好了
代碼如下:(會(huì)比較好理解)
#include <iostream> #include <vector> using namespace std; #include <cstring> #include <algorithm> string strSet[] = { "ABCDE", "ABCED", "ABDCE", "ABDEC", "ABECD", "ABEDC", "ACBDE", "ACBED", "ACDBE", "ACDEB", "ACEBD", "ACEDB", "ADBCE", "ADBEC", "ADCBE", "ADCEB", "ADEBC", "ADECB", "AEBCD", "AEBDC", "AECBD", "AECDB", "AEDBC", "AEDCB", "BACDE", "BACED", "BADCE", "BADEC", "BAECD", "BAEDC", "BCADE", "BCAED", "BCDAE", "BCDEA", "BCEAD", "BCEDA", "BDACE", "BDAEC", "BDCAE", "BDCEA", "BDEAC", "BDECA", "BEACD", "BEADC", "BECAD", "BECDA", "BEDAC", "BEDCA", "CABDE", "CABED", "CADBE", "CADEB", "CAEBD", "CAEDB", "CBADE", "CBAED", "CBDAE", "CBDEA", "CBEAD", "CBEDA", "CDABE", "CDAEB", "CDBAE", "CDBEA", "CDEAB", "CDEBA", "CEABD", "CEADB", "CEBAD", "CEBDA", "CEDAB", "CEDBA", "DABCE", "DABEC", "DACBE", "DACEB", "DAEBC", "DAECB", "DBACE", "DBAEC", "DBCAE", "DBCEA", "DBEAC", "DBECA", "DCABE", "DCAEB", "DCBAE", "DCBEA", "DCEAB", "DCEBA", "DEABC", "DEACB", "DEBAC", "DEBCA", "DECAB", "DECBA", "EABCD", "EABDC", "EACBD", "EACDB", "EADBC", "EADCB", "EBACD", "EBADC", "EBCAD", "EBCDA", "EBDAC", "EBDCA", "ECABD", "ECADB", "ECBAD", "ECBDA", "ECDAB", "ECDBA", "EDABC", "EDACB", "EDBAC", "EDBCA", "EDCAB", "EDCBA" };struct Node{char x,y;Node(char a='A',char b='A'):x(a),y(b){}; }; int label[120];//總共有120種可能排法,只需要找到最簡單的那個(gè)就好了 int minAns = 1<<30; string ans; string DataSet[101]; int n; int jiao(vector<Node> v1,vector<Node> v2){int a = 0;for (int i = 0; i < v1.size(); ++i) {for (int j = 0; j < v2.size(); ++j){if (v1[i].x == v2[j].x && v1[i].y == v2[j].y){a++;break;}}}return a; } int cHelp(int p,int q){//返回第p個(gè)序列和第q個(gè)序列之間的差距// p在strSet中找,q在DataSet中找 vector<Node> v1,v2;//v1放的是strSet[p]的二元子串;v2放的是v2放的是DataSet[q]的二元子串 for (int i = 0; i < 4;++i){for (int j = i + 1; j < 5; ++j){v1.push_back(Node(strSet[p][i], strSet[p][j]));v2.push_back(Node(DataSet[q][i], DataSet[q][j]));}}// sort and int num = jiao(v1,v2);return 10 - num; } // calculate void calculate(int temp){ // temp在strSet中 //計(jì)算第temp個(gè)字符的sum和//實(shí)現(xiàn)一個(gè)減枝,如果目前加的和已經(jīng)大于了當(dāng)前最小的那個(gè),就可以不用來看了for (int j = 0; j < n; ++j){label[temp] += cHelp(temp, j);if (label[temp] > minAns) {break;} // 減枝部分 }if (label[temp] < minAns){ans = strSet[temp];minAns = label[temp]; // 這是數(shù)值更新部分 } } int main(){while (cin >> n && n){for (int i = 0; i < n; ++i){cin >> DataSet[i];}memset(label,0,sizeof(label));//標(biāo)記復(fù)原為0; minAns = 1<<30;ans = "";//初始化 for (int i = 0; i < 120; ++i){calculate(i);} cout << ans<<" is the median ranking with value "<<minAns<<"."<< endl;} }最后,老套路,宣傳一波自己的公眾號(hào)!(求關(guān)注哇!)
本人中大一肥宅,歡迎大家關(guān)注,請(qǐng)掃下面的二維碼(〃’▽’〃)
如果覺得有幫助的話,可以掃碼,贊賞鼓勵(lì)一下!謝謝!
總結(jié)
以上是生活随笔為你收集整理的[SOJ1006] Team Rankings的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 全排列的生成
- 下一篇: Sicily1798. Alice an