1449 砝码称重
题目来源: CodeForces
基准时间限制:1 秒 空间限制:131072 KB 分值: 40 难度:4级算法题
现在有好多种砝码,他们的重量是 w0,w1,w2,... 每种各一个。问用这些砝码能不能表示一个重量为m的东西。
样例解释:可以将重物和3放到一个托盘中,9和1放到另外一个托盘中。
Input
单组测试数据。 第一行有两个整数w,m (2 ≤ w ≤ 10^9, 1 ≤ m ≤ 10^9)。
Output
如果能,输出YES,否则输出NO。
Input示例
3 7
Output示例
YES
类似二进制思想 把w转化成w进制的数 构成一个01串 因为每个砝码只能用一次
当余数是0 1的时候 m一定可以用w来表示 若补1 可以被整除的的话 也是可以用w表示 其实就是在m这边加一个砝码使两边平衡
否则就无法用w表示
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cctype> 2 #include <cstdio> 3 #include <iostream> 4 5 int n,k; 6 7 bool flag; 8 9 int hh() { 10 scanf("%d%d",&n,&k); 11 flag=true; 12 while(k) { 13 if(k%n==0||k%n==1) k/=n; 14 else if((k+1)%n==0) k=(k+1)/n; 15 else { 16 flag=false; 17 break; 18 } 19 } 20 flag?printf("YES\n"):printf("NO\n"); 21 return 0; 22 } 23 24 int sb=hh(); 25 int main(int argc,char**argv) {;}
我一个错误的贪心竟然只WA了5个点。。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
1 #include <cctype> 2 #include <cstdio> 3 #include <iostream> 4 5 typedef long long LL; 6 7 const int MAXN=100; 8 9 LL m,k; 10 11 LL q[MAXN]; 12 13 inline LL quick_pow(LL a,int b) { 14 LL ans=1; 15 while(b) { 16 if(b&1) ans*=a; 17 b>>=1; 18 a*=a; 19 } 20 return ans; 21 } 22 23 inline bool judge() { 24 LL t=k,i=1; 25 q[0]=1; 26 while(true) { 27 q[i]=quick_pow(m,i); 28 if(q[i]>k) break; 29 ++i; 30 } 31 for(int j=i;j>=0;--j) { 32 if(t-q[j]>=0) t-=q[j]; 33 if(t==0) return true; 34 } 35 return false; 36 } 37 38 int hh() { 39 std::cin>>m>>k; 40 if(!judge()) { 41 k+=m; 42 if(judge()) {printf("YES\n");return 0;} 43 } 44 else {printf("YES\n");return 0;} 45 printf("NO\n"); 46 return 0; 47 } 48 49 int sb=hh(); 50 int main(int argc,char**argv) {;}
作者:乌鸦坐飞机
出处:http://www.cnblogs.com/whistle13326/
新的风暴已经出现
怎么能够停止不前
穿越时空 竭尽全力
我会来到你身边
微笑面对危险
梦想成真不会遥远
鼓起勇气 坚定向前
奇迹一定会出现