zoukankan      html  css  js  c++  java
  • 11-砝码分配(利用3进制)

     /*题目内容:

    用天平称重时,我们希望用尽可能少的砝码组合称出尽可能多的重量。
    如果只有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;
    }

  • 相关阅读:
    “error LNK1169: 找到一个或多个多重定义的符号”的解决方法(转载)
    std::ostringstream 转std::string
    【转载】红外感应模块+蜂鸣器实现简易报警
    分割字符串使用空格
    优秀程序员的 18 大法则【转载】
    解决win10 iot VS编程出现的无法引用错误
    [转载] 程序员如何成功追到女神?
    win8/win10/win2012r2 存储池 冗余分析
    [转载][NAS] 使用win8的“存储池”功能~
    mySQL中删除unique key的语法 (删除某个字段的唯一性)
  • 原文地址:https://www.cnblogs.com/zhumengdexiaobai/p/7347600.html
Copyright © 2011-2022 走看看