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