您的位置:首页 > 其它

1449 砝码称重

2017-10-15 14:00 239 查看
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表示






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个点。。





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) {;}


错误代码
 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: