100 #P2916. *【思维】砝码设计

*【思维】砝码设计

Description

【题意】
有一个天平,请设计 $n$ 个砝码的重量来完成以下两个任务。
任务一:设计 $n$ 个砝码的重量,保证能称出 $1 \dots X$ 的连续整数重量,且且使的 $X$ 的值最大。例如 $n=2$,设计 $2$ 个砝码的重量分别为 $1$ 和 $3$ , 可称重为 $1,2,3,4$ 的连续重量。
任务二:在给出重量 $x$(保证 $1 \le x \le X$) ,输出称出 $x$ 的方案。
在上例中:
$x=2$ 称出的方案为 $2+1:3$
$x=4$ 称出的方案为 $4:1+3$
$x=1$ 称出的方案为 $1:1$

【输入】
一行两个整数 $n$ 和 $x$ ($1 \le n \le 10,0 \le x \le 30000$)

【输出】
输出两行。
第一行输出n个砝码的值。
第二行输出称出$x$的方案($x$在左边)

【输入样例1】
2 2

【输出样例1】
1 3
2+1:3

【输入样例2】
2 4

【输出样例2】
1 3
4:1+3

Hint

#include<bits/stdc++.h>
using namespace std;
int a[100],L[10],R[10];
int main()
{
    int n,x;scanf("%d%d",&n,&x);
    a[1]=1;for(int i=2;i<=n;i++)a[i]=a[i-1]*3;
    //考虑到每个砝码有三种用法:不用,放左边,放右边,由此联想到三进制
    for(int i=1;i<=n;i++) printf("%d ",a[i]);
    printf("\n");
a[n+1]=a[n]*3;
int s=x&#44;l=0&#44;r=0;
for(int i=1;i&lt;=n;i++)
{
    if((s+a[i])%a[i+1]==0)
    {
        L[++l]=a[i];
        s+=a[i];
    }
    else if((s-a[i])%a[i+1]==0)
    {
        R[++r]=a[i];
        s-=a[i];
    }
}
printf("%d"&#44;x);
for(int i=1;i&lt;=l;i++)printf("+%d"&#44;L[i]);
printf(":");
for(int i=1;i&lt;r;i++) printf("%d+"&#44;R[i]);
printf("%d\n"&#44;R[r]);
return 0;

}

</p>

Source

J5