http://acm.hdu.edu.cn/showproblem.php?pid=6223
题意:有n个城市,每个城市代表一个十进制地数字,从一个城市出发只能到达唯一的一个城市((i*i+1)%n),从每一个城市出发一直走n个城市,可以得到一个n位的十进制数,问最大的一个十进制数字是多少。
bfs是比较容易想到的。
经过我不懈地努力,终于写出了一份超时地bfs未剪枝地代码!
#include<iostream>
using namespace std;
#include<queue>
#include<string.h>
long long n;
char in[150005];
int num[150005];
int ans[150005];
long long nexthh[150005];
bool vis[150005];
typedef struct Point
{
int weizhi;
int num;
int step;
};
bool operator < (Point a,Point b)
{
if(a.step==b.step)
return a.num>b.num;
return a.step>b.step;
}
int main()
{
int t;
scanf("%d",&t);
int k;
for(k=1;k<=t;k++)
{
memset(vis,0,sizeof(vis));
memset(ans,0,sizeof(ans));
scanf("%lld",&n);
long long i;
int mmax=-1;
getchar();
for(i=0;i<n+1;i++)
{
scanf("%c",&in[i]);
num[i]=in[i]-'0';
mmax=max(mmax,num[i]);
nexthh[i]=(i*i+1)%n;
}
/*cout<<mmax<<endl;
for(i=0;i<n;i++)
cout<<num[i];
cout<<endl;*/
priority_queue<Point>q;
int answeizhi=0;
for(i=0;i<n;i++)
{
if(num[i]==mmax)
{
Point temp;
temp.num=mmax;
temp.step=1;
temp.weizhi=i;
q.push(temp);
}
}
ans[1]=mmax;
while(!q.empty())
{
Point curmax=q.top();
//int curstep=curmax.step;
q.pop();
if(curmax.num<ans[curmax.step]||curmax.step>n)
continue;
//vis[curmax.weizhi]=1;
Point nexti;
nexti.step=curmax.step+1;
nexti.weizhi=nexthh[curmax.weizhi];
nexti.num=num[nexti.weizhi];
if(nexti.num>=ans[nexti.step])
{
q.push(nexti);
ans[nexti.step]=nexti.num;
}
}
printf("Case #%d: ",k);
for(i=1;i<=n;i++)
printf("%d",ans[i]);
printf("\n");
}
return 0;
}