- android - RelativeLayout 背景可绘制重叠内容
- android - 如何链接 cpufeatures lib 以获取 native android 库?
- java - OnItemClickListener 不起作用,但 OnLongItemClickListener 在自定义 ListView 中起作用
- java - Android 文件转字符串
这是来自 Codechef 的问题,但请耐心等待。 https://www.codechef.com/ZCOPRAC/problems/ZCO16001
该竞赛是为在印度举行的 Zonal Computing Olympiad 做准备,因此它不是一个我可以从中获得一些东西的竞争性竞赛。只需要一点帮助来查看我的代码有什么问题,因为我觉得我忽略了一些大而愚蠢的事情。 :P
所以基本上这个问题总结起来就是这样。
Lets say that there are two vectors or arrays. You need to swap elements between them such that the sum of their maximum elements is minimum. However you can swap at most K times. Then output the value of this sum.
我的方法很简单。从 Vector1 (V1) 中取出最大的数字并将其与 V2 中的最小数字交换。添加每个的最高值。做同样的事情,但这次将 V2 中的最高数字与 V1 中的最低数字交换。添加每个的最高值。更好的交换将是总和最低的交换,并从那里继续 K 次。
例如:
V1 = 5 6 7 9
V2 = 9 10 5 4
在这种情况下,如果 K = 1我首先将 V1 的 9 与 V2 的 4 交换。这给出:
V1 = 5 6 7 4
V2 = 9 10 5 9
与之前的 19 相比,最高数字的总和为 17。我可以做的第二个交换是 V2 的 10 和 V1 的 5 给出:
V1 = 10 6 7 4
V2 = 9 5 5 9
这给出的总和为 19,所以第一次交换更好,输出应该是 17。
这是我的解决方案:
#include <iostream>
#include <vector>
#include <algorithm>
#define print(vec) for (int i = 0; i < vec.size(); i++) { cout << vec[i] << " "; } cout << endl;
using namespace std;
vector <long long int> s1, s2;
inline long long int calc(vector <long long int> v1, vector<long long int> v2) {
return *max_element(v1.begin(), v1.end()) + *max_element(v2.begin(), v2.end());
}
int main(){
long long int n, k;
cin >> n >> k;
long long int x;
for (unsigned int i = 0; i < n; i++) {
cin >> x;
s1.push_back(x);
}
for (unsigned int i = 0; i < n; i++) {
cin >> x;
s2.push_back(x);
}
while (k--) {
vector <long long int> b1(s1);
vector <long long int> b2(s2);
long long int skewb = calc(b1,b2);
vector <long long int> v1(s1);
vector <long long int> v2(s2);
auto mn1 = minmax_element(v1.begin(), v1.end());
auto mn2 = minmax_element(v2.begin(), v2.end());
iter_swap(mn1.second, mn2.first);
b1 = vector <long long int> (v1);
b2 = vector <long long int> (v2);
skewb = calc(v1,v2);
v1 = vector <long long int> (s1);
v2 = vector <long long int> (s2);
mn1 = minmax_element(v1.begin(), v1.end());
mn2 = minmax_element(v2.begin(), v2.end());
iter_swap(mn2.second, mn1.first);
if (calc(v1,v2) <= skewb) {
b1 = vector <long long int> (v1);
b2 = vector <long long int> (v2);
}
if (b1 == s1 && b2 == s2) cout << "LOL" << endl;
s1 = vector <long long int> (b1);
s2 = vector <long long int> (b2);
}
cout << calc(s1, s2) << endl;
}
请注意,这会进行所有交换,即 K。因此,即使当前安排是最好的,它仍会交换一些值。早些时候,当当前的安排是最好的时候,我正在打破。这样做的原因是因为除了两个之外,我所有的测试用例都是正确的!猜猜更烦人的是,每个任务都有一个! :(所以我意识到必须完成所有 K 开关。然而,即使是现在我也有 2 个测试用例出错,一定有一些我忽略的地方。
知道它是什么吗?解决方案链接:https://www.codechef.com/viewsolution/11574501
顺便说一下,任务 1 的 K = 1。
最佳答案
您的代码的问题是您在交换之间更改数组,因此有可能在数组之间来回交换一个项目。我的意思是,在第一次交换中,您将元素 x 从 array1 放置到 array2 中,而在下一次交换中,您可能会再次将其交换回去。
你还做了很多 vector 复制,这使得代码效率低下。即使您的代码逻辑正确,您的代码也不会超过时间限制,因为您的方法是 O(n2)。
首先请注意,最佳答案是当一个数组中的所有元素都大于另一个数组中的所有元素时。
由于两个数组都已排序,您可以在假设交换后通过一次比较找到数组的最大元素。
V1 = 5 6 7 9 -> 5 6 7 9
V2 = 9 10 5 4 -> 4 5 9 10
x = 0 no swaps: result = V1[size-1] + V2[size-1]
x = 1
result = max(V1[size-1], V2[size-1]) + max(V1[0], V2[size-2])
result = max(V1[size-2], V2[0]) + max(V1[size-1],V2[size-1])
x = 2
result = max(V1[size-1], V2[size-1]) + max(V1[1], V2[size-3])
result = max(V1[size-3], V2[1]) + max(V1[size-1],V2[size-1])
...
这是公认的实现:
#include <iostream>
#include <algorithm>
#include <queue>
#include <vector>
#include <map>
using namespace std;
int main()
{
int n,k;
cin>>n>>k;
vector<int> v[2];
for ( int i=0;i < 2;++i ){
for ( int j=0;j<n;++j ){
int temp; cin>> temp;
v[i].push_back(temp);
}
}
sort(v[0].begin(),v[0].end());
sort(v[1].begin(),v[1].end());
int result = v[0].back() + v[1].back();
for ( int i=1; i<=k; ++i ){
int t = max(v[0][n-1],v[1][n-1]) + max(v[0][i-1],v[1][n-1-i]);
result = min(result,t);
t = max(v[0][n-1-i],v[1][i-1]) + max(v[0][n-1],v[1][n-1]);
result = min(result,t);
}
cout << result << endl;
}
关于c++ - 在两个 vector 之间交换值,使两个 vector 的 max_elements 之和最小,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39660537/
这个问题可能类似于In Angular2 *ngFor iteration, how do I output only unique values from the array?但我的问题是还有更多功
我编写了一个算法来获取 float 的总和,该算法对于整数来说非常有效,但是当我应用于 float 时,我得到的总和是负数。但是我的 float 数组只有正 float 。在这里我发布我的代码,感谢您
我想将这个简单的 for 循环转换为并行循环。它遍历字符串数组(从文本文件读取的 float )并计算总和。 for (int i = 0; i { float tmp; if (f
我正在尝试总结日期差异,一切都很好,除了如果有相同日期我想添加 1,例如,如果起始日期是:01/01/2003到目前为止是 01/01/2003 那么我想添加 1 天,但它没有添加 1 天,而是仅在
这个问题已经有答案了: 已关闭10 年前。 Possible Duplicate: Is JavaScript’s Floating-Point Math Broken? 这将是一个非常基本的计算机科
我刚接触sql,卡住了。我正在尝试计算每个用户走过的(每年)距离总和。我有一个具有以下结构的表(我们称之为 dist_table): rowid user_name date
我刚接触sql,卡住了。我正在尝试计算每个用户走过的(每年)距离总和。我有一个具有以下结构的表(我们称之为 dist_table): rowid user_name date
给定一个正数数组。我想将数组拆分为 2 个不同的子集,以使它们的 gcd(最大公约数)之和最大。 示例数组:{6,7,6,7}。 答案:需要的两个子集是:{6,6}和{7,7};它们各自的 gcd(s
我想在我的数组中求和:
我想将下面的字符串拆分为字母和数字,然后我需要计算数字的总和。我的示例问题是 a[20]={"abcd123dc2"}; 预期输出: abcddc 8 我的代码: int main() { c
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
为什么 sizeof 运算符返回的结构大小大于该结构成员的总大小? 最佳答案 这是因为添加了填充以满足对齐约束。 Data structure alignment影响程序的性能和正确性: 未对齐的访问
我是一名优秀的程序员,十分优秀!