1. 程式人生 > >百練1248:Safecracker

百練1248:Safecracker

() als urn 字典序 %d end std puts 多個

題目鏈接:http://bailian.openjudge.cn/practice/1248/

題目大意:

給定一個正數target(小於12000000)和一串由大寫字母組成的數組(長度為5~12),從數組中挑出5個字母,用v,w,x,y,z表示,這5個字母滿足如下關系:

    v - w2+ x3- y4+ z5= target 其中A=1,B=2,...,Z= 26

當存在多個滿足條件的解時,輸出按字典序排序的最後一個解

分析:

  暴力搜索,將輸入的字符串轉換為數字(1~26),並將其從大到小排序,以保證遍歷時遇到的第一個解時字典序最大的解。

#include <cstdio>
#include 
<string> #include <vector> #include <algorithm> using namespace std; string quote; char temp[15];bool compare(int a,int b){ return a > b; } int main(){ unsigned int target; vector<int> v; int two[27]; int three[27]; int four[27]; int five[27];
for(int i = 1;i <= 26;i++){ int p = i; two[i] = p*p; three[i] = two[i] * p; four[i] = three[i] * p; five[i] = four[i] * p; } bool find; while(true){ scanf("%d%s",&target,temp); quote = temp; if(target == 0 && quote == "
END")break; v.clear(); int L = quote.length(); for(int i = 0;i < L;i++) v.push_back(quote[i] - A + 1); sort(v.begin(),v.end(),compare); int size = v.size(); find = false; for(int j = 0;j < size;j++){ for(int k = 0;k < size;k++){ if(k == j)continue; for(int m = 0;m < size;m++){ if(m == k || m == j )continue; for(int n = 0;n < size;n++){ if(n == m || n == k || n == j )continue; for(int i = 0;i < size;i++){ if(i == j || i == k || i == m || i == n)continue; //if(five[v[i]] < target)break; //最開始剪枝剪錯了。。。 if(v[j] - two[v[k]] + three[v[m]] - four[v[n]] + five[v[i]]== target) {printf("%c%c%c%c%c\n",v[j]+A-1,v[k]+A-1,v[m]+A-1,v[n]+A-1,v[i]+A-1);find = true;break;} } if(find)break; } if(find)break; } if(find)break; } if(find)break; } if(!find)puts("no solution"); } }

百練1248:Safecracker