Posted: Thu Nov 09, 2006 9:01 pm
Many Many thanx to ImLazy and gits. But, ImLazy, U forgot to remove code.
R u really that lazy??
R u really that lazy??
Code: Select all
#define T(_I, _J) table[_I+(_J<<5)]
...
double table[32<<5];
Code: Select all
#include <stdio.h>
#include <stdlib.h>
int main(void)
{
const double EPS = 1e-13;
int i, j, k, l, expected, index;
double convTable[21][21];
double orgConvTable[21][21];
char route[21][21][21];
int routeLen[21][21];
int numOfCountries;
int found, changed;
/*freopen("in.txt", "rt", stdin);
freopen("out.txt", "wt", stdout);*/
while (scanf(" %d", &numOfCountries) == 1)
{
memset(routeLen, 0, sizeof(routeLen));
found = 0;
changed = 0;
for (i = 0; i < numOfCountries; ++i)
{
for (j = 0; j < numOfCountries; ++j)
{
if (i == j)
convTable[i][j] = (double)1.0;
else
{
scanf(" %Lf", &convTable[i][j]);
orgConvTable[i][j] = convTable[i][j];
}
}
}
for (expected = 0; expected < numOfCountries - 1; ++expected) /* expected route length */
{
for (i = 0; i < numOfCountries; ++i) /* maximise conversion from i to j and i to i */
{
for (j = 0; j < numOfCountries; ++j)
{
double max = convTable[i][j];
double t;
int tempk;
for (k = 0; k < numOfCountries; ++k)
{
if (j == k) /* orgConvTable[k][j] is always 1 */
continue;
if (routeLen[i][k] == expected)
{
t = convTable[i][k] * orgConvTable[k][j];
if (t > max)
{
max = t;
tempk = k;
changed = 1; /* this set might have a solution */
}
}
}
if (convTable[i][j] != max)
{
convTable[i][j] = max;
for (k = 0; k < routeLen[i][tempk]; ++k)
{
route[i][j][k] = route[i][tempk][k];
}
route[i][j][k] = tempk;
routeLen[i][j] = expected + 1;
}
}
}
/* find if 0.01 profit can be made converting i to i */
for (i = 0; i < numOfCountries; ++i)
{
if (convTable[i][i] - (double)1.01 > EPS)
{
found = 1;
index = i;
break;
}
}
if (!changed)
break;
if (found)
break;
}
if (!found)
printf("no arbitrage sequence exists\n");
else
{
printf("%d", index + 1);
for (i = 0; i < routeLen[index][index]; ++i)
{
printf(" %d", route[index][index][i] + 1);
}
printf(" %d\n", index + 1);
}
}
return 0;
}
Code: Select all
20
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455
1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455 1
1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1.00049764032455
Code: Select all
1 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1
tmp = best[k][steps-1] * best[k][j][1]
Code: Select all
best[i][k][steps-m]*best[k][j][m]
Code: Select all
program Project2;
{$APPTYPE CONSOLE}
{$R-}{$S-}{$Q-}
type
integer = longint;
var
a: array [1..20,1..20] of extended;
b: array [1..20,1..20,1..20] of extended;
p: array [1..20,1..20,1..20] of integer;
seq: array [1..20] of integer;
i,j,k,l,m,n: integer;
col: integer;
i1: integer;
fl: boolean;
begin
while not eof do
begin
n := -1;
readln (n);
if n<1 then
break;
for i := 1 to 20 do
for j := 1 to 20 do
begin
a[i,j] := 1.0;
b[i][j][1] := 1;
for l := 2 to n do
b[i][j][l] := 0
end;
for i := 1 to n do
begin
j:=0;
while j<n do
begin
j := j + 1;
if j=i then continue;
read (a[i,j]);
b[i][j][1] := a[i][j];
p[i][j][1] := i;
end
end;
for l := 2 to n do
for k := 1 to n do
for i := 1 to n do
for j := 1 to n do
if b[i][k][l-1]*b[k][j][1] > b[i][j][l] then
begin
b[i][j][l] := b[i][k][l-1]*b[k][j][1];
p[i][j][l] := k
end;
fl := false;
for l := 2 to n do
begin
for i := 1 to n do
if b[i][i][l]>1.01 then
begin
seq[l] := p[i][i][l];
for m := l-1 downto 1 do
seq [m] := p[i][seq[m+1]][m];
for j := 1 to l do
write (seq[j],' ');
writeln (i);
fl := true;
break;
end;
if fl then
break
end;
if not fl then
writeln ('no arbitrage sequence exists');
end;
end.
Code: Select all
#include<iostream.h>
int main()
{
int flag,s,i,j,t,n,seq[22],finseq[22],maxx,l,f,k;
double mult,table[21][21];
while(cin>>n)
{
for(i=0;i<n;i++)
for(j=0;j<n;j++)
if(i==j)
table[i][j]=1.0;
else
cin>>table[i][j];
finseq[0]=-1;
maxx=60;
for(i=3;i<(1<<n);i++)
{
t=i; s=0; mult=1.0; l=-1; f=-1; k=0; flag=0;
while(t!=0)
{
if(t%2==1)
{
if(l==-1)
f=s;
seq[s]=s;
if(l!=-1)
mult*=table[seq[l]][seq[s]];
l=s;
k++;
if(k>=maxx)
{ flag=1; break; }
}
else
seq[s]=-1;
t/=2;
s++;
}
if(flag==1)
continue;
mult*=table[seq[l]][seq[f]];
seq[s]=seq[f];
s++;
if(mult>1.01)
if(k<maxx)
{
maxx=k; t=0;
for(j=0;j<s;j++)
if(seq[j]!=-1)
{ finseq[t]=seq[j]; t++; }
if(maxx==2)
break;
}
}
if(finseq[0]==-1)
cout<<"no arbitrage sequence exists"<<endl;
else
for(j=0;j<=maxx;j++)
if(j==maxx)
cout<<finseq[j]+1<<endl;
else
cout<<finseq[j]+1<<" ";
}
}