#include <stdio.h> #define k 4 int data[k] = {4, 4, 5, 9}; void sort(int data[]) { int i,j; for (i = 0; i < k; i++) { for (j = i+1; j < k; j++) { if (data[i] > data[j]) { int temp = data[i]; data[i] = data[j]; data[j] = temp; } } } } //max = (12+11) + ((12+11) + 5) + ((12+11+5) +2) - (k - 1); //min = (2+5) + ((2+5)+11) + ((2+5+11) + 2) - (k-1); //按照这两个公式求解的 int main() { int i; sort(data); for (i = 0; i < k; i++) printf("%d ", data[i]); //求最差情况 int index = k-1; int max = 0; while(index > 0) { int i; for (i = k-1; i >= index-1; i--) { max += data[i]; } index--; } //最好情况.虽然有点波折,但是最终搞出来了 //思路:在不考虑效率的条件下,我就能想到啥发用啥发, //遍历整个数组,找出最小的两个,其中一个赋值成二者的和, 另一赋成一个大值(不影响结果的)每次遍历加,即可. printf("\n"); int j, minValue = 0; for (j = 0; j < k-1; j++) { index = 2; int min1 = 10000000, minIndex1, min2 = 10000000, minIndex2; while(index > 0){ for (i = 0; i < k; i++) { if (min1 > data[i] && index == 2) { min1 = data[i]; minIndex1 = i; } if (min2 > data[i] && index == 1 && i != minIndex1) { min2 = data[i]; minIndex2 = i; } } index--; } data[minIndex2] = 10000000; printf("%d\n", minValue); printf("%d %d \n", min1, min2); minValue += (min1 + min2); data[minIndex1] = min1 + min2; int y; for (y = 0; y < k; y++) { printf("%d ", data[y]); } printf("\n"); } printf("最查情况: %d, 最好情况: %d", max, minValue); return 0; }
石子合并问题
最新推荐文章于 2022-09-29 20:49:52 发布