A 热心的牛牛
解题思路:想要给n个朋友分严格比自己多的糖,自己又想要分尽可能多的糖,那么假设朋友分得x个糖,自己分得b个糖,x=b+1时自己的糖最多,即(b+1)*n+b=k,b=(k-n)/(n+1)。
class Solution {
public:
/**
代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
返回牛牛能吃到的最多糖果数
@param n long长整型
@param k long长整型
@return long长整型
**/
long long Maximumcandies(long long n, long long k) {
// write code here
if(n>=k)return 0;
else return (k-n)/(n+1);
}
};B 牛牛切木棒
解题思路:三角形的任何两边之和都大于第三边,只要分出的段中任何两边之和都小于等于第三边即可,假设分成了n段,a[1],a[2]...a[n],则保证 a[i]>=a[i-1]+a[i-2] 即可,取等号时每个段最小分出的段数最多,分出的段即是斐波那契数列,数列和大于木棒长度时,最后一段不足的木棒长度加到上一个木棒上即可,也能保证上述不等式成立(这点比赛的时候没想到,卡了=.=),以下两个代码均可。
class Solution {
public:
/**
*
* @param a long长整型 木棒的长度
* @return int整型
*/
long long f[100]={1,1};
int stick(long long a) {
// write code here
for(int i=2;i<64;i++)f[i]=f[i-1]+f[i-2];
int t=0;
while(f[t]<=a){
t++;
a=a-f[t-1];
}
return t;
}
};
class Solution {
public:
/**
*
* @param a long长整型 木棒的长度
* @return int整型
*/
long long f[100]={1,1};
int stick(long long a) {
// write code here
for(int i=2;i<64;i++)f[i]=f[i-1]+f[i-2];
int t=0;
long long sum=0;
for(int i=0;i<64;i++)
{
if(sum>a)break;
sum+=f[i];
t++;
}
return t-1;
}
};
C Tree II
解题思路:完全k叉树,第i个结点的父结点编号为(i-1)/k,因此求出每个结点与父结点异或和即可;
第二个代码是按照题目层次序遍历求异或和。
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param k int整型 表示完全k叉树的叉数k
* @param a int整型vector 表示这棵完全k叉树的Bfs遍历序列的结点编号
* @return long长整型
*/
long long tree2(int k, vector<int>& a) {
// write code here
int n=a.size();
long long ans=0;
for(int i=1;i<n;++i){
ans+=a[i]^a[(i-1)/k];
}
return ans;
}
};
class Solution {
public:
/**
* 代码中的类名、方法名、参数名已经指定,请勿修改,直接返回方法规定的值即可
*
* @param k int整型 表示完全k叉树的叉数k
* @param a int整型vector 表示这棵完全k叉树的Bfs遍历序列的结点编号
* @return long长整型
*/
long long tree2(int k, vector<int>& a) {
// write code here
long long ans=0;
int n=1,m=a.size();
queue<int>q;
q.push(a[0]);
while(!q.empty())
{
if(n==m)break;
int d=q.front();
q.pop();
for(int i=1;i<=k;++i)
{
if(n<m){
ans+=d^a[n];
q.push(a[n]);
n++;
}
}
}
return ans;
}
};
京公网安备 11010502036488号