我正在处理问题添加分数:http://www.codechef.com/problems/ADDFRAC/ 在codechef。 如果有人可以帮助我理解问题的算法,那将会很有帮助。
P.S:我试过这个问题,但由于我的算法是O(n ^ 2),我的时间限制超过了。 我的代码:http://www.codechef.com/viewsolution/2278117答案 0 :(得分:1)
你是用两个简单的for循环来做的。
然而你应该做的是以相反的方式开始并继续计算直到总和大于当前总和
如果您看到最佳答案,则可以看到索引是从n-1到1
计算一直持续到if条件满足 - 即下一个分数加法大于当前总和
它将它存储在一个单独的数组中(表示最大的索引,直到它为止)
for(int index=n-1; index>0; index--) {
int j=index+1;
while(j<=n) {
next_num=numerator[j];
next_den=denominator[j];
if((1.0*numerator[index])/denominator[index]
<(1.0*(numerator[index]+next_num))
/(denominator[index]+next_den)) {
numerator[index]=numerator[index]+next_num;
denominator[index]=denominator[index]+next_den;
j=upto[j]+1;
//printf("%d/%d ", numerator[index], denominator[index]);
} else {
upto[index]=j-1;
break;
}
}
if(j>n) {
upto[index]=n;
}
}