------------只要够努力,人生最坏的结局不过是大器晚成!!!

 /*题目内容:

用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
如果只有5个砝码,重量分别是1,3,9,27,81。
则它们可以组合称出1到121之间任意整数重量(砝码允许放在左右两个盘中)。
本题目要求编程实现:对用户输入的重量(1~121),
给出砝码组合方案(用加减式表示,减代表砝码放在物品盘)。
例如:
输入:
5
输出:
9-3-1

输入:
19
输出:
27-9+1

要求程序输出的组合总是大数在前小数在后。

输入描述

用户输入的重量(1~121),

输出描述

给出砝码组合方案(用加减式表示,减代表砝码放在物品盘)。


输入样例

19

输出样例

27-9+1


程序代码

3.寻找第K大值 (15分)
C时间限制:3000 毫秒 |  C内存限制:3000 Kb
题目内容:

 在一个整数数组中,寻找第k大值所在位置。假设每个数值都不一样。要求算法时间复杂性通常情况下为线性。

输入描述

包括一个数组长度n,一个k, 以及紧接着的n个整数值。整数之间用空格隔开。


输出描述

第k大值所在位置编号。规定数组的第一个位置编号为0.


输入样例

7 3
1 4 3 9 8 7 2


输出样例

5
*/
//观察到给的砝码全是3的倍数,考虑进制相加,将各个数 表示成三进制就可以看出规律,
//物品为1的位表示取该位对应的砝码,为二则是将对应位砝码放入物品一端,即减去该砝码重量,并将后一位加一  
#include <iostream>
#include <algorithm>
using namespace std;
bool cmp(int a, int b){
    return abs(a) > abs(b);
}

int main(){
    int z, count = 0, n, a[10] = {0}, b[10] = {1, 3, 9, 27, 81}, c[10]={0};
    cin >> n;
    z = n;
    while(z >= 3){
        a[count++] = z % 3;
        z = z / 3;
    
    }
    if(z != 0){
        a[count++] = z;
    }
//    for(int i = count - 1; i >= count/2; i--){  //换位
//        int temp = a[i];
//        a[i] = a[count - 1 - i];
//        a[count - 1 - i] = temp;
//    }
    int s = 0;
    for(int i = 0; i < 10; i++){
        if(a[i] != 0){
            if(a[i] == 1){
                c[s++] = b[i];
            }
            else{
                c[s++] = 0 - b[i];
//                c[s++] = b[i + 1];
                a[i + 1]++;
            }
        }
    }
    sort(c, c + 10, cmp);
    for(int i = 0; i < 10; i++){
        if(i == 0)
            cout << c[i];
        else if(c[i] > 0){
            cout << "+" << c[i];
        }
        else if(c[i] < 0)
            cout << c[i];
    }
    
//    for(int i = 0; i < 10; i++)
//        cout << c[i] << " ";
    return 0;
}

posted on 2017-08-11 19:26  ystraw  阅读(679)  评论(0编辑  收藏  举报

不经一番切孤寒,怎得梅花扑鼻香