我已经解决了HackerEarth的问题。 问题是
菲尼亚斯正在他的后院建造一座城堡,以给伊莎贝拉留下深刻印象(奇怪,不是吗?)。他已经准备好了所有的东西。一楼即使已经完工。现在是时候做出上半部分了。这是事情变得有趣的地方。经过漫长的一天画围栏后,Ferb正在房子里睡觉(你们大家帮助了他,不是吗!),Phineas必须自己做所有的工作。他很擅长这一点,他想要你做的就是操作小型起重机来抬起石头。墙上的石头已被切断,准备好等你抬起它们。
现在我们没有Ferb操作迷你起重机,他是一名专家,我们必须尽快完成这项工作。我们获得了起重机的最大起重能力和每块石头的重量。由于它是一台小型起重机,我们一次不能放置2块以上(任何可能尺寸)的石块,否则会扰乱起重机的平衡。我们需要知道有多少转弯我们可以将石头交给正在建造城堡的菲尼亚斯。
INPUT:输入的第一行给出T,即测试用例的数量。对于每个测试案例,第一行给出M,即起重机的最大起重能力。每个测试用例的下一行的第一个整数N给出了石头的数量,后跟N个数字,指定了单个石头X的重量。
输出:对于每个测试用例,打印起重机操作的最小匝数,以便提升所有石块。
约束:
1 <= T <= 50
1 <= M <= 1000
1 <= N <= 1000
示例输入
1
50
3 28 22 48
示例输出
2
解释 在第一个回合中,28和22将被一起提升。在第二回合48将被解除。 丢弃重量轻的石头&gt;最大起重能力。
现在我已经解决了这个问题,我的源代码是
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <vector>
using namespace std;
int main(void) {
int T = 0;
scanf("%d",&T);
while(T--) {
int i = 0,M = 0, N = 0,max = 0, res = 0, index = 0, j = 0, temp = 0;
vector<int> v1;
scanf("%d",&M);
scanf("%d",&N);
for(i = 0; i < N ;++i) {
scanf("%d",&temp);
if(temp <= M)
v1.push_back(temp);
}
for(i = 0; i < v1.size() ; ++i) {
max = 0;
index = 0;
if(v1[i] != -1) {
for(j = i + 1; j < v1.size(); ++j) {
if(v1[j] != -1) {
temp = v1[i] + v1[j];
if(temp > max && temp <= M) {
max = temp;
index = j;
}
}
}
++res;
v1[i] = -1;
v1[index] = -1;
}
}
printf("%d\n",res);
}
return 0;
}
现在这是我的问题
答案 0 :(得分:2)
虽然背包问题是典型的动态编程问题,但这个简化的问题不需要动态编程。你的解决方案的复杂性确实是O(n ^ 2),这种方法更适合描述为Greedy当你试图找到每块石头的最佳对时,如果存在的话。如果你先对石头进行排序并处理有序矢量,那么复杂性可以进一步降低到O(nlgn)。