牛牛爱奇数
题意:每次操作都会使得该偶数除以2,问最少操作多少次使得所有的数都是奇数。
思路:贪心,我们先从大的开始操作可以确保次数最少,例如4 8,我们先操作8,然后操作4,如果反过来的话,就会多操作一次4,不符合贪心。然后对每个数除2直到它是奇数,判断这个奇数是否之前出现过,没出现的话就加上它的除2的次数。
代码:
class Solution {
public:
/**
* 返回一个数,代表让这些数都变成奇数的最少的操作次数
* @param n int整型 代表一共有多少数
* @param a int整型vector 代表n个数字的值
* @return int整型
*/
// typedef long long ll;
// for(int i=2;i<)
map<int,int> mp;
int solve(int n, vector<int>& a) {
// write code here
int ans=0;
sort(a.begin(),a.end());
for(int i=n-1;i>=0;i--){
int temp=a[i];
int k=0;
while(temp%2==0){
temp/=2;
k++;
}
if(mp[temp]==0){
mp[temp]=1;
ans+=k;
}
}
return ans;
}
};牛牛摆放花
题目:将n盆花摆放成一个圆,使得相邻的高度值最小。
思路:差分思想,我们首先将这些花的高度排序,然后按照顺序将花分在两端,最后对分好后的花取相邻的最大高度即可。
代码:
class Solution {
public:
/**
* ?返回按照这些花排成一个圆的序列中最小的“丑陋度”
* @param n int整型 花的数量
* @param array int整型vector 花的高度数组
* @return int整型
*/
int b[100010];
int solve(int n, vector<int>& a) {
// write code here
sort(a.begin(),a.end());
int k=0;
for(int i=1;;i++){
b[i]=a[k++];
if(k==n) break;
b[n-i+1]=a[k++];
if(k==n) break;
}
int ans=0;
for(int i=1;i<n;i++){
ans=max(ans,abs(b[i]-b[i+1]));
}
return ans;
}
};
京公网安备 11010502036488号