首页 > 试题广场 >

vivo智能手机产能

[编程题]vivo智能手机产能
  • 热度指数:6905 时间限制:C/C++ 1秒,其他语言2秒 空间限制:C/C++ 256M,其他语言512M
  • 算法知识视频讲解
在vivo产线上,每位职工随着对手机加工流程认识的熟悉和经验的增加,日产量也会不断攀升。
假设第一天量产1台,接下来2天(即第二、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 ... ... 
以此类推,请编程计算出第n天总共可以量产的手机数量。



示例1

输入

11

输出

35

说明

第11天工人总共可以量产的手机数量

备注:
输入:n,代表第n天
输出:总的量产手机数量

[编程题]vivo智能手机产能
数学解法,只需两行。
n天可以拆分为1+2+3+...+k+r,r表示余项
产出的手机量为12+22+32+...+k2+(k+1)r。
我也写了第二题的答案,[编程题]数位之积 vivo2020

class Solution {
public:
    int solution(int n) {
        // write code here
        int res = 0, i = 1;
        while (!(((i * i + i) / 2 < n) && ((i * i + 3 * i + 2) / 2 >= n))) i++;
        return i*(i+1)*(2*i+1)/6 + (i+1) * (n - (i * i + i) / 2);
    }
};
发表于 2020-04-06 13:05:01 回复(0)
🤣🤣c++
class Solution {
public:
    int solution(int n) {
        int ans = 0,i = 1,days = 0;
        while(days <= n){
            if(days + i > n){
                ans += (n - days) * i;
                return ans;
            }
            else
                ans += i * i;
            days += i;
            i++;
        }
        return ans;
    }
};


发表于 2020-06-01 18:28:21 回复(0)
public class Solution {
    /**
     *
     * @param n int整型 第n天
     * @return int整型
     */
    public int solution (int n) {
        // write code here
        int sum=0,k=1;
         
        //  1,  2,2,  3,3,3, 4,4,4,4  ...
        //  1*1, 2*2,  3 * 3, 4  *  4  ..
        //  算出 第K个整数天
        while(k*(k+1)/2 < n) k++;
                --k;  //注意此处!
        //  不足k的,天数为n-(k*(k+1)/2),该天数内每天生产(k+1)
        sum = (n-(k*(k+1)/2))*(k+1);
        for(; k>=0; k--) sum = sum + k*k;
        return sum;
         
    }
}

编辑于 2020-04-18 01:08:21 回复(0)
python 思路
发表于 2020-04-16 13:36:57 回复(0)
class Solution {
public:
    /**
     * 
     * @param n int整型 第n天
     * @return int整型
     */
    int solution(int n) {
        // write code here
        int i = 0, sum = 0, sumday = 0;
        while(sumday < n)
        {
            i++;
            sumday += i;
        } //算出第几组
        int tmpi = i;
        while(i > 0)
        {
            sum += i * i;
            i--;
        }
        
        sum -= (sumday - n) * tmpi;
       return sum;
    }
};
发表于 2020-04-01 15:04:29 回复(0)
列了个一元二次方程硬解的。。。
    public static int solution (int n) {
        int x = (int)Math.ceil((-1 + Math.sqrt(1 + 8 * n)) / 2);
//        System.out.println(x);
        int sum = 0;
        for (int i = 1; i < x; i++) {
            sum += i * i;
        }
        int day = (1 + x - 1) * (x - 1) / 2 + 1;
//        System.out.println(day);
        sum += x * (n - day + 1);
        return sum;
    }


发表于 2020-03-30 22:13:26 回复(0)
import java.util.*;
 
 
public class Solution {
    /**
     *
     * @param n int整型 第n天
     * @return int整型
     */
    public int solution (int n) {
        int pn=0;
        for(int i=1;i<n;i++){
            int t=(1+i)*i/2;
            if(t>n){
                pn+=i*(n-(i-1)*i/2);
                break;
            }
            pn+=i*i;
        }
        return pn;
    }
}

发表于 2020-03-28 21:52:25 回复(6)
class Solution {
public:
    /**
     *
     * @param n int整型 第n天
     * @return int整型
     */
    int solution(int n) {
        // write code here
        int ans = 0;
        for(int i=1; n>0; ++i){
            ans += i * min(i, n);
            n -= i;
        }
        return ans;
    }
};


发表于 2020-04-27 14:11:11 回复(10)
我觉得我第一次代码写这么挺简洁的


class Solution:
    def solution(self , n ):
        ans = 0
        i = 1
        while n - i > 0:
            ans += (i * i)
            n -= i
            i += 1
        ans += (i * n)
        return ans




编辑于 2020-04-12 22:29:23 回复(3)
纯数学解法,首先等差数列求和1+2+3+4+。。。。+k=k(k+1)/2,令它等于n,解出向下归整后的最大K(一元二次方程求根公式),然后计算到K时一共有多少天,再用n减去就是多出来的天数(例n=11,k=4,到k处一共10天,多出1天),最后利用平方和求结果res,res=(1*1+2*2+3*3+4*4+。。。。+k*k)+多出来的天数*(k+1);
public int solution (intn) {
        int k = (int)((Math.sqrt(1+8*n)-1)/2);
        int remain = n-k*(k+1)/2;
        int res = k*(k+1)*(2*k+1)/6+remain*(k+1);
        return res;
    }
发表于 2020-04-20 11:01:59 回复(4)
普普通通的方法,好理解
    public int solution (int n) {
        int sum=0;
        int tem=1;
        for (int i = 1; i <= n;) {
            for (int j = 1; j <=tem && i<=n; j++) {
                sum+=tem;
                i++;
            }
            tem++;
        }
        return sum;
    }


发表于 2020-05-18 13:57:12 回复(3)
1.有个规律第一天产量是 1的平方, 第三天的产量是1的平方 + 2的平方, 第五天是1的平方+2的平方+3的平方 ,所以给出n天时,先求出K,也就是 n天的产量能从 1的平方加到k的平方,然后再加上剩下的天数的产量
2.k的求法是,1+2+3+...+k=n  产量规律正好与这个相同,2,就是有两天,且每日产量也是2, 3就是有3天,每日产量是3,所以,求出k,就能求出能从 1的平方加到k的平方,k是向下取整,
3.剩下的天数是r =n-k, 每日产量为 k+1
4总产量是 12+22+32+...+k2+(k+1)r
编辑于 2020-06-05 10:49:11 回复(1)
    public int solution (int n) {
        // write code here
        int test = 0;
        int res = 0;
        int i = 1;
        int t = 1;
        if(n == 1){
            return 1;
        }
//确定当前第n天所对应的累加1,2,3...当前所处的第几个天数+1
        while(test <= n){
            test += i;
            i++;
        }
//假设当前所处天数为4,则计算到天数3的res:根据分析,可以看到每个天数t所对应的那几天的产量t*t;
        while(t < i-1){
            res += t*t;
            t++;
        }
        System.out.println(t);
        // return i;
//此时res为截至上一阶段天数的累计产量,还需要加上这个阶段天数所对应的产量。
        return res + (n + t - test)*t;
    }
}
笨笨的数学方法:首先需要判断第n天对应是1,2,3累加到第几个天数(i-1);计算之前的累加产量sum(t*t);再累加上当前天数阶段的产量。
发表于 2024-02-22 17:23:02 回复(0)
这通项公式是不是有眼睛就能看出来。
class Solution {
public:
    /**
     * 
     * @param n int整型 第n天
     * @return int整型
     */
    int get(int x)
     {
        return floor(0.5+sqrt(2.0*x));
     }
    int solution(int n) {
        // write code here
        int ans=0;
        for(int i=1;i<=n;i++)ans+=get(i);
        return ans;
    }
};


发表于 2023-05-14 11:16:00 回复(0)

浅尝一下C++

class Solution {
public:
    /**
     * 
     * @param n int整型 第n天
     * @return int整型
     */
    int solution(int n) {
        // write code here
        int sum = 0;
        int day = 0;
        int i = 1;
        if(n == 1)
            return 1;
        for(i;day + i < n ;i++)
        {
            sum += i * i;
            day += i;
        }
        sum += (n-day)*i;
        return sum;
    }
};
发表于 2023-02-27 20:10:22 回复(0)
import java.util.*;


public class Solution {

    public int solution (int n) {
        int afterDay = 1; //接下来的1,2,3,4天
        int i = 0; //第几天--也可以从1开始,不过需要修改条件<=n, i== n+1
        int sum = 0;
        while(i < n) {
            //接下来的afterDay天内,产量都是afterDay
            for(int j = 1; j <= afterDay; j++) {                
                sum+=afterDay;
                i++;
                if(i == n) return sum;
            }
            afterDay+=1;
        }
        return sum;
    }
}

发表于 2022-09-01 21:42:11 回复(0)
        // 跟楼下大佬学的,那个min()可以自己写一个方法也可以直接用三目运算符,总之拿两个数字之间的小的那个就可以了
        int num = 0;
        for(int i = 1 ; n>0;i++){
            num += i*(i>n?n:i);
            n -= i;
        }
        return num;
发表于 2022-06-21 22:57:26 回复(0)
class Solution {
public:
    /**
     * 
     * @param n int整型 第n天
     * @return int整型
     */
    int solution(int n) {
        int k = int(sqrt(2 * n));
        while(true){
            if(n - k*(k+1)/2 < 0)
                --k;
            else if(n - (k+1)*(k+2)/2 >= 0)
                ++k;
            else break;
        }
        return k*(k+1)*(2*k + 1)/6 + (k+1)*(n - k*(k+1)/2);
    }
};

发表于 2021-09-16 14:49:18 回复(0)
//hashMap解法
import java.util.*;
 
 
public class Solution {
    /**
     *
     * @param n int整型 第n天
     * @return int整型
     */
    public int solution (int n) {
        Map<Integer,Integer> map=new HashMap<>();
        int j=1;
        int total=0;
        for(int i=1;i<=n;i++){
            if(map.get(j)==null){
                map.put(j,1);
            }else{
                int value=map.get(j);
                if(value==j){
                    j++;
                    map.put(j,1);
                }else{
                    map.put(j,value+1);
                }
            }
            total+=j;
        }
        return total;
 
    }
}

发表于 2021-07-02 09:37:21 回复(0)
class Solution {
public:
    /**
     * 
     * @param n int整型 第n天
     * @return int整型
     */
    int solution(int n) {
        // write code here
        vector<int> day;
        int ans=0;
        for (int i=1;i<=n*(n+1)/2;i++)
        {
            for (int j=0;j<i;j++)
            {
                day.push_back(i);
            }
        }
        for (int i=0;i<n;i++)
        {
            ans+=day[i];
        }
        return ans;
    }
};
发表于 2021-06-16 20:16:00 回复(0)