翻滚吧牛牛(一)

思路:数学+模拟。我们首先可以发现我们的答案是呈周期进行变化的,周期就是这个多边形的边的个数。当次数除以6之后为1或5的时候,那么就是,为2和4的时候为,如果为3的话就是
代码:

class Solution {
public:
    /**
     * 
     * @param k int整型 翻滚次数
     * @return double浮点型
     */
    double circumference(int k) {
        // write code here
        double ans=0;
        double k1=1.0/3.0,k2=sqrt(3.0)/3.0,k3=2.0/3.0;
        for(int i=1;i<=k;i++){
            int tmp=i%6;
            if(tmp==1||tmp==5)  ans+=k1;
            else if(tmp==2||tmp==4)  ans+=k2;
            else if(tmp==3)  ans+=k3;
        }
        //cout<<ans<<endl;
        double pi=3.1415926535;
        ans=ans*pi;
        return ans;
    }
};

牛牛的分配

思路:贪心。我们发现,为了使可以达到要求的瓶子尽可能地多的话,我们就要把原来已经达到要求的,而且多出来的水先收集起来,然后,按目前未达到的要求的瓶子的水量从少到多进行分配,直到把所有的多出来的水都被用完了或者已经不能再使得任何一个瓶子达到要求或者我们能把所有的瓶子都达到要求。
代码:

class Solution {
public:
    /**
     * 返回重新分配后,满足牛牛要求的水量的瓶子最多的数量
     * @param n int整型 瓶子的数量
     * @param x int整型 牛牛的对瓶中的水量要求
     * @param a int整型vector 每个瓶子中的含水量
     * @return int整型
     */
    int solve(int n, int x, vector<int>& a) {
        // write code here
        sort(a.begin(),a.end());
        long long sum=0;
        int k=-1;
        for(int i=n-1;i>=0;i--){
            if(a[i]<x){
                k=i;
                break;
            }
            else{
                long long tmp=a[i]-x;
                sum+=tmp;
            }
        }
        int ans=n;
        for(int i=k;i>=0;i--){
            long long tmp=x-a[i];
            if(sum<tmp){
                ans=n-i-1;
                break;
            }
            else  sum-=tmp;
        }
        return ans;
    }
};

牛牛构造等差数列

思路:暴力。我们知道,最终如果有答案的话,那一定是从数组里面的第一个和第二个数变化而得到的。数组的前两个中每个可以变化为3个值,那么,我们就有9种变化情况。我们逐个进行枚举,然后逐个考虑即可。
代码:

class Solution {
public:
    /**
     * 返回最少多少次操作后能使这几个数变成一个等差数列,如果完全不能构造成功,就返回-1
     * @param n int整型 代表一共有n个数字
     * @param b int整型vector 代表这n个数字的大小
     * @return int整型
     */
    int solve(int n, vector<int>& b) {
        // write code here
        vector<int> a;
        int ans=1e9+7;
        for(int i=1;i>=-1;i--){
            for(int j=1;j>=-1;j--){
                a=b;
                a[0]+=i,a[1]+=j;
                int mid=a[1]-a[0];
                int num=0;
                if(i!=0)  num++;
                if(j!=0)  num++;
                for(int k=2;k<n;k++){
                    if(abs(a[k-1]+mid-a[k])==1){
                        num++;
                        a[k]=a[k-1]+mid;
                    }
                    else if(abs(a[k-1]+mid-a[k])>1){
                        num=1e9+7;
                        break;
                    }
                }
                ans=min(ans,num);
            }
        }
        if(ans!=1e9+7)  return ans;
        else  return -1;
    }
};