#include <cstdio>
#include <cmath>
#include <cstdlib>
#include <ctime>
using namespace std;
#define MAXN 12
int n;
struct Cow
{
int cowFriend[3];//id of friends
int pos;
}cow[MAXN+1];
int cowId[MAXN];
int ans;
void swapCow(int x,int y)
{
int temp=cow[y].pos;
cow[y].pos=cow[x].pos;
cow[x].pos=temp;
cowId[cow[x].pos]=x;
cowId[cow[y].pos]=y;
}
int f()
{
int i,j;
int res=0;
for (i=1;i<=n;i++)
{
for (j=0;j<3;j++)
{
res+=abs(cow[i].pos-cow[cow[i].cowFriend[j]].pos);
}
}
return res/2;
}
void work()
{
double T=3000;
double delta_T=0.998;
int ans_new,x,y;
while (T>1e-10)
{
do
{
x=rand()%n+1;
y=rand()%n+1;
}while (x==y);
swapCow(x,y);
ans_new=f();
if (ans_new<ans)
{
ans=ans_new;
}
else
{
if (exp((ans-ans_new)/T)*RAND_MAX>rand())
ans=ans_new;
else
{
swapCow(x,y);
}
}
T*=delta_T;
}
}
int main()
{
srand(12345678);
srand(rand());
scanf("%d",&n);
int i;
for (i=1;i<=n;i++)
cowId[i]=i;
for (i=1;i<=n;i++)
{
scanf("%d%d%d",&cow[i].cowFriend[0],&cow[i].cowFriend[1],&cow[i].cowFriend[2]);
cow[i].pos=i;
}
ans=f();
work();
printf("%d\n",ans);
return 0;
}
这段代码只能得65分,下载数据并本地运行后发现出错的数据输出了一个极小的ans。(答案是42,本地输出10)
将work函数中所有ans=ans_new;的下一行都加上if(ans==10)printf("*");,主函数中的ans=f();的下一行也加上。运行程序,发现ans仍然输出10,但没有输出任何星号。
百思不得其解下,把第14行的int ans;改为int ans=1000;,再次提交,居然过了??本地的输出也变正常了。
为什么会这样?在进行work()函数之前,明明已经初始化ans=f()了,而且之前的代码(包括f()函数)也没有涉及任何和ans有关的东西啊
黑人问号.jpg