8 solutions
-
5
//某神金的方法(注释某金蝉加的) #include<bits/stdc++.h> using namespace std; int main(){ int ppp,max=1,sum=0; cin>>ppp; while(ppp>max){ max*=2; sum++;//计算k在2进制中的位数 } while(ppp){ if(ppp%2==0)sum--;//低位如果有0的话,就要减掉 else break; ppp/=2; }cout<<max<<" "<<sum; return 0; }
//某金蝉的方法 #include<iostream> using namespace std; int main(){ int k,a=1,sum=0; cin>>k; while(a<k)a*=2;//巧克力最小值一定要比顾客的巧克力大,又要是2的非负整数次方 cout<<a<<" "; int u=a/2; while(a!=k){ if(a>k)a-=u;//巧克力太大就剪切 if(a<k)a+=u;//巧克力太小就添加 sum++;//计算剪切次数 u/=2;//每剪切或添加一次,下次需要添加或剪切的巧克力就要除以2,不然会死循环 } cout<<sum; return 0;//帅气结束 } //PS:两种方法原理一样,但第二种方法更为易懂
-
5
#include<bits/stdc++.h> using namespace std; int n; int m(int x){//一个函数寻找2的妈(幂) int y=1; while(y<x) y*=2; return y; } int main(){ cin>>n; int t=m(n),ans=t;//用t来存m以免多次计算m,ans记录t因为后面t会变 int s=0,sum=0;//s:目前巧克力总数;sum:总刀数 if(t==n){ cout<<n<<' '; cout<<0<<endl;//若不用切直接输出 return 0; } int k=n; while(s!=n){ if(t<=k){//注意不是每一个t都取 s+=t; k-=t; } sum++; t/=2;//除以2继续循环 } cout<<ans<<" "<<sum-1<<endl;//sum会多一,减掉 return 0;//无需多言 }
-
1
using namespace std; void Cokolada(int K){ int n2=K,m=0,sum=0,times=0;; for(int i=0;i<K;i++){//寻找最近的2的整数幂 if(K==pow(2,i)){ cout<<K<<" "<<0;//如果K本身是2的整数幂则输出本身,需要切0次,返回 return; } if(pow(2,i)>K){ cout<<int(pow(2,i))<<" ";//否则输出最小的大于K的2的整数幂 m=i-1;//这里设成i-1是因为2^i-1是最大的不大于K的2的整数幂 break;//跳出循环以免出bug } } while(sum!=K){//不断切分直到切出K个单位为止 if(pow(2,m)<=n2){//寻找最大的不大于n2的2的整数幂,之所以需要n2是因为K要作为定值 sum+=pow(2,m);//说明已经存在sum个单位的蛋糕 n2-=pow(2,m);//还需要n2个单位的蛋糕 } times++;//切的次数+1 m-=1;//下一刀分出来的块数是原来的二分之一 } cout<<times;//输出 return; } int main() { int K; cin>>K; Cokolada(K); return 0; }
- 1
Information
- ID
- 908
- Time
- 1000ms
- Memory
- 32MiB
- Difficulty
- 7
- Tags
- # Submissions
- 154
- Accepted
- 36
- Uploaded By