牛牛爱奇数

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