牛牛爱奇数
题意:每次操作都会使得该偶数除以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; } };