在vivo产线上,每位职工随着对手机加工流程认识的熟悉和经验的增加,日产量也会不断攀升。
假设第一天量产1台,接下来2天(即第二、三天)每天量产2件,接下来3天(即第四、五、六天)每天量产3件 ... ...
以此类推,请编程计算出第n天总共可以量产的手机数量。
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); } };
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; } }
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; }
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; } }
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; } };
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
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);再累加上当前天数阶段的产量。
浅尝一下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; } };
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; } }
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); } };
//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; } }