私は、重み付きの間隔のセットを取り、重みを最大化する2人の「ワーカー」間でそれらを最適に分散するコードを作成しようとしています。入力の例は次のようになります。
9
1 2 1
1 3 3
2 4 1
3 5 1
4 6 2
5 7 1
6 8 2
7 9 1
8 10 2
「9」は間隔の量であり、列は次のように定義されます。
s f v
s=start time
f=finish time
v=weight
これまで、二分探索を使用して、直前の間隔である「p」値を決定し、それを配列に格納してきました。そこから、入力変数を1つずつ調べて、最大の重みと、現在の間隔をいずれかのワーカーの「キュー」に含めるかどうかを決定します。
これまでの私のコードは次のとおりです。
#include <stdio.h>
#include <stdlib.h>
#define TABSIZE (100)
int n,s[TABSIZE],f[TABSIZE],v[TABSIZE],p[TABSIZE],M[TABSIZE],M2[TABSIZE];
int binSearchLast(int *a,int n,int key)
{
// Input: int array a[] with n elements in ascending order.
// int key to find.
// Output: Returns subscript of the last a element <= key.
// Returns -1 if key<a[0].
// Processing: Binary search.
int low,high,mid;
low=0;
high=n-1;
// subscripts between low and high are in search range.
// size of range halves in each iteration.
// When low>high, low==high+1 and a[high]<=key and a[low]>key.
while (low<=high){
mid=(low+high)/2;
if (a[mid]<=key)
low=mid+1;
else
high=mid-1;
}
return high;
}
main()
{
int i,j,sum=0,sum2=0;
scanf("%d",&n);
f[0]=(-999999); // For binarySearchLast
for (i=1;i<=n;i++)
scanf("%d %d %d",&s[i],&f[i],&v[i]);
for (i=2;i<=n && f[i-1]<=f[i];i++);
if (i<=n){
printf("Intervals not ordered by finish time %d\n",__LINE__);
exit(0);
}
for (i=1;i<=n;i++)
p[i]=binSearchLast(f,n+1,s[i]);
M[0]=0;
M2[0]=0;
//checks to see if the resulting weight is bigger in a certain queue
for (i=1;i<=n;i++){
if(v[i]+M[p[i]]>M[i-1] && !(v[i]+M2[p[i]]>M2[i-1]))
M[i]=v[i]+M[p[i]];
else if(v[i]+M2[p[i]]>M2[i-1] && !(v[i]+M[p[i]]>M[i-1]))
M2[i]=v[i]+M2[p[i]];
else
M[i]=M[i-1];
}
printf("\n\nroom 1:\n\n");
for (i=n;i>0; ){
if (v[i]+M[p[i]]>=M[i-1]){
printf("%d %d %d\n",s[i],f[i],v[i]);
sum+=v[i];
i=p[i];
}
else
i--;
}
printf("\n\nroom 2:\n\n");
for (i=n;i>0; ){
if (v[i]+M2[p[i]]>=M2[i-1]){
printf("%d %d %d\n",s[i],f[i],v[i]);
sum2+=v[i];
i=p[i];
}
else
i--;
}
printf("sum 1 is %d\n",sum);
printf("sum 2 is %d\n",sum);
}
これは部屋1でも機能するようですが、部屋2は何らかの理由でまったく同じキューで出てきます。これは私の現在の出力です:
room 1:
8 10 2
6 8 2
4 6 2
2 4 1
1 2 1
room 2:
8 10 2
6 8 2
4 6 2
2 4 1
1 2 1
「正しい」出力が次のようになる場合:
room 1:
8 10 2
6 8 2
4 6 2
2 4 1
1 2 1
room 2:
7 9 1
5 7 1
3 5 1
1 3 3
任意の洞察をいただければ幸いです。
編集**それを見ると、結果を印刷するときにM[]とM2[]に含まれる間隔を決定する方法に実際に関係しているのではないかと思います。2つの部屋の出力が同じであるのは偶然のようです。私はまだそれを修正するために何をすべきかを理解していませんが、私はまだアドバイスを探しています。