1.小v最近在玩一款挖矿的游戏,该游戏介绍如下:
1、每次可以挖到多个矿石,每个矿石的重量都不一样,挖矿结束后需要通过一款平衡矿车运送下山;
2、平衡矿车有左右2个车厢,中间只有1个车轮沿着导轨滑到山下,且矿车只有在2个车厢重量完全相等且矿石数量相差不超过1个的情况下才能成功运送矿石,否则在转弯时可能出现侧翻。
假设小v挖到了n(n<100)个矿石,每个矿石重量不超过100,为了确保一次性将n个矿石都运送出去,一旦矿车的车厢重量不一样就需要购买配重砝码。请问小v每次最少需要购买多少重量的砝码呢? (假设车厢足够放下这些矿石和砝码,砝码重量任选)
private static int solution(int[] input) {
// TODO Write your code here
int sum = 0;
int n = input.length;
for(int i = 0; i < n; i++) sum += input[i];
int halfNum=(n+1)/2;
int halfWeight=(sum+1)/2;
int diff = 10000; // 两车矿石的重量差
// 动态规划,dp[i][j]表示用i块矿石能否使重量为j
boolean[][] dp=new boolean[105][10005];
dp[0][0]=true;
int weight=0;//一辆矿石车的重量
for(int i=0;i<n;i++){
for(int j=sum;j>=input[i];j--){
for(int k=n;k>=0;k--){
// 如果可以用k块矿石凑j-input[i]的重量
if(dp[k][j-input[i]]){
dp[k+1][j]=true;//选上第i块石头凑出重量j
if(k+1==halfNum&&Math.abs(j-halfWeight)<diff){
diff=Math.abs(j-halfWeight);
weight=j;
}
}
}
}
}
return Math.abs(sum-weight*2);
}
2.今年7月份vivo迎来了新入职的大学生,现在需要为每个新同事分配一个工号。人力资源部同事小v设计了一个方法为每个人进行排序并分配最终的工号,具体规则是:
将N(N<10000)个人排成一排,从第1个人开始报数;如果报数是M的倍数就出列,报到队尾后则回到队头继续报,直到所有人都出列;
最后按照出列顺序为每个人依次分配工号。请你使用自己擅长的编程语言帮助小v实现此方法。
private static String solution(int[] input) {
int n=input[0];
int m=input[1];
// TODO Write your code here
ArrayList<Integer> list=new ArrayList();
for(int i=0;i<n;i++){
list.add(i+1);
}
StringBuilder res=new StringBuilder();
int temp=0;
for(int j=0;j<n;j++){
temp=(temp+m-1)%list.size();
res.append(list.get(temp)+" ");
list.remove(temp);
}
return res.toString().trim();
}
3.小v在公司负责游戏运营,今天收到一款申请新上架的游戏“跳一跳”,为了确保提供给广大玩家朋友们的游戏都是高品质的,按照运营流程小v必须对新游戏进行全方位了解体验和评估。这款游戏的规则如下:
有n个盒子排成了一行,每个盒子上面有一个数字a[i],表示在该盒子上的人最多能向右移动a[i]个盒子(比如当前所在盒子上的数字是3,则表示可以一次向右前进1个盒子,2个盒子或者3个盒子)。
现在小v从左边第一个盒子上开始体验游戏,请问最少需要移动几次能到最后一个盒子上?
private static int solution(int[] input) {
// TODO Write your code here
if(input.length==1) return 0;
if(input.length>1&&input[0]==0) return -1;
int[] dp=new int[input.length];
for(int i=0;i<input.length;i++){
int range=Math.min(input.length-1,i+input[i]);
for(int j=i+1;j<=range;j++){
if(dp[j]==0) dp[j]=dp[i]+1;
}
}
return dp[input.length-1]==0?-1:dp[input.length-1];
}