#(File IO): input:amp.in output:amp.out
@[TOC]
时间限制: 1000 MS
空间限制: 128000 KB
题目描述
西西需要把输入的电压
1
1
1伏通过一系列电压放大器放大成原来的
N
N
N倍,然后输出。
西西现在手上有两种放大器:
第一种能够把
X
X
X伏的电压放大成
2
X
−
1
伏
2X-1伏
2X−1伏
第二种能够把
X
X
X伏的电压放大成
2
X
+
1
伏
2X+1伏
2X+1伏
放大器是串联(即按顺序放在一条线路上)的。
现在西西手上有用不完的放大器,他希望能组出一个电路,使用数量最少的放大器,使得电压被放大了刚好
N
N
N倍。
输入解释
1 1 1行 1 1 1个正整数 N ( 1 < = N < = 2 ∗ 1 0 9 ) N(1<=N<=2*10^9) N(1<=N<=2∗109)
输出解释
如果无法组成电路则输出一行No solution.
否则输出两行,第一行一个整数表示最少的放大器个数K,第二行K个用空格隔开的1或2,表示放大器序列。1表示第一种,2表示第二种,其中左边为输入端。如果有多解输出任意一组。
样例输入#1
5 5 5
样例输出#1
2
2
2
2
2
2
1
1
1
数据范围限制
20 20 20%的数据中 N < = 1000 N<=1000 N<=1000
50 50 50%的数据中, N < = 1000000 N<=1000000 N<=1000000
100 100 100%的数据如题。
提示
**先经过放大器 2 2 2, 1 ∗ 2 + 1 = 3 1*2+1=3 1∗2+1=3,然后经过 1 1 1, 3 ∗ 2 − 1 = 5 3*2-1=5 3∗2−1=5。满足要求 **
思路~此题有点水啊~
没什么思路,额,就用暴力来打就行了,按着题意慢慢来,4~5分钟就AC一道题。
Violence AC Code
#include <bits/stdc++.h>
using namespace std;
int n,x,t,ans[105];//定义
int main(){
freopen("amp.in","r",stdin);//文件输入(比赛中一定要加freopen,不然就会炸掉;一般做题也尽量加。)
freopen("amp.out","w",stdout);//文件输出(比赛中一定要加freopen,不然就会炸掉;一般做题也尽量加。)
scanf("%d",&n);//输入正整数n
if(n%2==0)//判断是否可以组成电路,如果无法组成电路则输出一行No solution,否则输出两行,第一行一个整数表示最少的放大器个数K,
//第二行K个用空格隔开的1或2,表示放大器序列。1表示第一种,2表示第二种,其中左边为输入端。如果有多解输出任意一组。
printf("No solution");
else
{
x=n,t=0;
while(x!=1)
{
if(((x-1)/2+1)%2==1)
x=(x+1)/2,ans[++t]=1;
else
x=(x-1)/2,ans[++t]=2;
}
printf("%d\n",t);
for(int i=t;i>=1;--i)
printf("%d ",ans[i]);
}
return 0;//结束
}