在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;
}
}