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,l=0,r=0;
for(int i=1;i<=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",x);
for(int i=1;i<=l;i++)printf("+%d",L[i]);
printf(":");
for(int i=1;i<r;i++) printf("%d+",R[i]);
printf("%d\n",R[r]);
return 0;
}
</p>
Source
J5相关
在下列比赛中: