题意:在给出的字符串中找一个五大小的序列,使得它符合题目中给出的公式,要求给出字典序最大的。
思路:模拟。我直接暴力枚举,也能过。
http://acm.hdu.edu.cn/showproblem.php?pid=1015
#include <map>
#include <set>
#include <queue>
#include <cmath>
#include <ctime>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <iostream>
#include <algorithm>
#define rep(i,a,b) for(int i = a ; i <= b ; i ++)
#define rrep(i,a,b) for(int i = b ; i >= a ; i --)
#define repE(p,u) for(Edge * p = G[u].first ; p ; p = p -> next)
#define cls(a,x) memset(a,x,sizeof(a))
#define eps 1e-8
using namespace std;
const int MOD = 1e9+7;
const int INF = 0x3f3f3f3f;
const int MAXN = 1e5+5;
const int MAXE = 2e5+5;
typedef long long LL;
typedef unsigned long long ULL;
int T,n,m,k;
char s[105];
bool cmp(char a1,char a2) {
return a1 > a2;
}
int g_pow(int num,int ki) {
int ret = 1;
rep(i,1,ki) ret *= num;
return ret;
}
int tr(char a) {
return a - 'A' + 1;
}
void input() {
}
void solve() {
int ok = 0;
int lens = strlen(s);
sort(s,s+lens,cmp);
rep(i,0,lens-2) {
if(s[i] == s[i+1]) {
rep(j,i,lens-2) s[i] = s[i+1];
lens --;
i --;
}
}
if(lens < 5) {
}
else {
rep(i,0,lens-1) rep(ia,0,lens-1) rep(ib,0,lens-1) rep(ic,0,lens-1) rep(id,0,lens-1) {
if(i==ia||i==ib||i==ic||i==id||ia==ib||ia==ic||ia==id||ib==ic||ib==id||ic==id) {
continue;
}
if(n == tr(s[i])-g_pow(tr(s[ia]),2)+g_pow(tr(s[ib]),3)-g_pow(tr(s[ic]),4)+g_pow(tr(s[id]),5))
{
ok =1;
printf("%c%c%c%c%c\n",s[i],s[ia],s[ib],s[ic],s[id]);
goto ss;
}
}
}
ss:
if(!ok) puts("no solution");
}
int main(void) {
while(scanf("%d %s",&n,s),n) {
input();
solve();
}
return 0;
}