【发布时间】:2016-05-08 21:17:53
【问题描述】:
我正在通过 Google Code Jam 解决一个问题,但我无法解决该问题:http://code.google.com/codejam/contest/32016/dashboard#s=p0(最小标量积,问题 A 2008)
我使用的策略是:
- 接受用户的
v1和v2 - 对
v1和v2进行排序 - 反转
v2,即按降序对v2进行排序 - 将对应的
v1[i] * v2[i]直接相乘并将结果存储在product中 - 总结所有此类产品并打印答案
我做了一些研究,确实这似乎是唯一可能获得的排列。但是,我的代码没有产生正确的输出:
#include <stdio.h>
#include <algorithm>
#include <iostream>
using namespace std;
int main()
{
int T;
int cases;
FILE *fin = fopen ("A-small-practice.in", "r"); // open input file
FILE *fout = fopen ("output.out", "w");
fscanf(fin, "%d", &T);
for(cases = 1; cases <= T; cases++)
{
int v1[1000], v2[1000];
int i,j; int n;
int product =0;
fscanf(fin, "%d", &n);
for(i=0; i < n; i++)
{
fscanf(fin, "%d",&v1[i]);
fscanf(fin, "%d", &v2[i]);
}
sort(v1,v1+n);
sort(v2,v2+n);
reverse(v1, v1+n);
int k;
for(k = 0; k < n; k++)
{
product += v1[k] * v2[k];
}
fprintf(fout, "Case #%d: %d\n", cases, product);
}
return 0;
}
【问题讨论】: