求算法,将N个整数分到M个数组中,要求元素和相差最小,元素个数相差最小
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了求算法,将N个整数分到M个数组中,要求元素和相差最小,元素个数相差最小相关的知识,希望对你有一定的参考价值。
有N个大小不一的整数,可以是0,将它们分配到M个数组中,要求M数组的
元素的和相差最小,数组的元素个数相差最小。
比如将1,2,3,4,5,6,7,8,9,10分配到4个数组中,其结果可以是
n1 n2 n3 n4
---------------
2 1
4 3 5 6
10 9 8 7
===============
14 14 13 14
冰天雪地跪求其算法
我是新人分不多,全给了,请高人不吝赐教
首先要满足的是数组间元素和相差最小,再此条件上满足数组间元素个数相差最小。
谢谢大家的意见,按1楼和3楼的做法都不能达到最佳效果。
我现在是按从大到小排列,S型放入数组,得到如下结果:
N1 N2 N3 N4
-----------------------------
2 1
3 4 5 6
10 9 8 7
==============================
15 14 13 13
离14,14,13,14的最佳结果仍然有差距,不知道大家还有没有什么好方法。。。
(2) 对这N 个 数 按大小排队
int i,j,tmp;
int x[N];
for (i=0;i<N-1;i++)
for (j=i+1;j<N;j++)
if (x[i] > x[j])
tmp = x[i]; x[i]=x[j];x[j]=tmp;
(3) 分 M 组
int y[M][10]; // 第2维 大于 N/M+1 即可。
for(j=0;j<M;j++) for(i=0;i<10;i++) y[j][i]=-999; //初始化
for (j=0;j<M;j++)
for (k=0;k<N/M+1;k++)
if (j+k*M < N) y[j][k]=x[j+k*M];
(4)打印结果。 参考技术A 这没什么算法吧 先把N个数排序 然后按S型的顺序放入4个数组中
即第1,8……放在数组1中;2,7……放在数组2中;3,6……放在数组3中;4,5……放在数组4中。 参考技术B 要求M数组的
元素的和相差最小,数组的元素个数相差最小
这两个二者取其一还是怎麼著?
这个条件比较复杂
算法训练 集合运算
问题描述
给出两个整数集合A、B,求出他们的交集、并集以及B在A中的余集。
输入格式
第一行为一个整数n,表示集合A中的元素个数。
第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
第三行为一个整数m,表示集合B中的元素个数。
第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
集合中的所有元素均为int范围内的整数,n、m<=1000。
第二行有n个互不相同的用空格隔开的整数,表示集合A中的元素。
第三行为一个整数m,表示集合B中的元素个数。
第四行有m个互不相同的用空格隔开的整数,表示集合B中的元素。
集合中的所有元素均为int范围内的整数,n、m<=1000。
输出格式
第一行按从小到大的顺序输出A、B交集中的所有元素。
第二行按从小到大的顺序输出A、B并集中的所有元素。
第三行按从小到大的顺序输出B在A中的余集中的所有元素。
第二行按从小到大的顺序输出A、B并集中的所有元素。
第三行按从小到大的顺序输出B在A中的余集中的所有元素。
样例输入
5
1 2 3 4 5
5
2 4 6 8 10
1 2 3 4 5
5
2 4 6 8 10
样例输出
2 4
1 2 3 4 5 6 8 10
1 3 5
1 2 3 4 5 6 8 10
1 3 5
样例输入
4
1 2 3 4
3
5 6 7
1 2 3 4
3
5 6 7
样例输出
1 2 3 4 5 6 7
1 2 3 4
1 2 3 4
思路:首先三种情况我都是先导入数组,然后排序后输出,交集和余集都好说,两层循环遍历即可,并集想了很久,我先把两个数组都导入一个新的数组,然后排序,然后再输入,重复的不予输出,即 arr3[i] != arr3[i - 1] ,才会输出。
学习:用sort对vector数组排序时,实参是 v.begin(),v.end() ,相应代码即 sort(arr3.begin(), arr3.end(), cmp) , cmp 中若 return a < b; 是升序排列,反之是降序排列。
1 #include<iostream> 2 #include<vector> 3 #include<algorithm> 4 using namespace std; 5 6 bool cmp(int a, int b) 7 { 8 return a < b; 9 } 10 11 int main() 12 { 13 int arr1Num,arr2Num; 14 int flag = 0; 15 16 cin >> arr1Num; 17 vector<int> arr1(arr1Num); 18 for (int i = 0; i < arr1Num; i++) 19 { 20 cin >> arr1[i]; 21 } 22 23 cin >> arr2Num; 24 vector<int> arr2(arr2Num); 25 for (int i = 0; i < arr2Num; i++) 26 { 27 cin >> arr2[i]; 28 } 29 30 //交集 31 int b[2000] = { 0 }; 32 int l = -1; 33 for (int i = 0; i < arr1Num; i++) 34 { 35 for (int j = 0; j < arr2Num; j++) 36 { 37 if (arr1[i] == arr2[j]) 38 { 39 flag = 1; //有交集 40 b[++l] = arr1[i]; 41 } 42 } 43 } 44 if (flag == 1) //有交集才输出换行 45 { 46 sort(b, b + l + 1, cmp); 47 for (int i = 0; i < l + 1; i++) 48 { 49 cout << b[i] << " "; 50 } 51 cout << endl; 52 } 53 54 //并集 55 vector<int> arr3(arr1Num+arr2Num); 56 for (int i = 0; i < arr1Num; i++) //把两个数组的数字全导入arr3中 57 { 58 arr3[i] = arr1[i]; 59 } 60 for (int j = arr1Num; j < arr1Num + arr2Num; j++) 61 { 62 arr3[j] = arr2[j - arr1Num]; 63 } 64 sort(arr3.begin(), arr3.end(), cmp); //从小到大排序 65 cout << arr3[0] << " "; 66 for (int i = 1; i < arr1Num + arr2Num; i++) 67 { 68 if (arr3[i] != arr3[i - 1]) 69 { 70 cout << arr3[i] << " "; 71 } 72 } 73 cout << endl; 74 75 //余集 76 int i, j,k = -1; 77 int a[2000] = { 0 }; //先记录下来 78 int cnt = 0; 79 for (i = 0; i < arr1Num; i++) 80 { 81 for (j = 0; j < arr2Num; j++) 82 { 83 if (arr1[i] == arr2[j]) 84 { 85 break; 86 } 87 } 88 if (j == arr2Num) 89 { 90 a[++k] = arr1[i]; 91 cnt++; 92 } 93 } 94 sort(a, a + k + 1, cmp); //从小到大输出 95 for (i = 0; i < cnt; i++) 96 { 97 cout << a[i] << " "; 98 } 99 return 0; 100 }
以上是关于求算法,将N个整数分到M个数组中,要求元素和相差最小,元素个数相差最小的主要内容,如果未能解决你的问题,请参考以下文章