美団出前2017お年玉問題コメント
1714 ワード
試験を準備して過去の問題を復習する時CSDNの上で多くこの問題についての転載と評論があることを見て、その中の大多数のJAVAの解法が同じ方法を採用したことを発見します.この方法は基本的に問題の要求に達しているが,依然として100%通過率を満たすことができない.
一つの机の上にいくつかの数値の等しくないお年玉を置いて、1つの輪に囲まれて、今あなたにいくつかのお年玉を選んで、隣接する2つのお年玉を同時に選択することができなくて、プログラミングしてお年玉を選んで得た金額の最大値を求めます;
入力:
2
1,2,3
1,2,3,4
出力:
3
6
題意を理解すると、これは強盗問題の環状版であることがわかります(参考住所:https://leetcode.com/problems/house-robber-ii/)
キュー版との違いは末尾の処理にあるので、0位から計算するのと1位から計算するのとの違いを別々に検討すればいいです.以下はコードです(書くのが遅いので、議論部分を関数的に最適化することができます):
一つの机の上にいくつかの数値の等しくないお年玉を置いて、1つの輪に囲まれて、今あなたにいくつかのお年玉を選んで、隣接する2つのお年玉を同時に選択することができなくて、プログラミングしてお年玉を選んで得た金額の最大値を求めます;
入力:
2
1,2,3
1,2,3,4
出力:
3
6
題意を理解すると、これは強盗問題の環状版であることがわかります(参考住所:https://leetcode.com/problems/house-robber-ii/)
キュー版との違いは末尾の処理にあるので、0位から計算するのと1位から計算するのとの違いを別々に検討すればいいです.以下はコードです(書くのが遅いので、議論部分を関数的に最適化することができます):
package code_test;
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;
public class HongBao {
//
public static void main(String[] args) {
Scanner in = new Scanner(System.in);
int n = Integer.valueOf(in.nextLine());
//list
List list = new ArrayList();
for(int i = 0; i < n; i++){
String[] temp = in.nextLine().split(",");
int[] arr = new int[temp.length];
for(int j = 0; j < temp.length; j++){
arr[j] = Integer.valueOf(temp[j]);
}
list.add(arr);
}
for(int[] l:list){
// 1
if(l.length==1)
{
System.out.println(l[0]);
}else{
//
int include = 0;
int exclude = 0;
for(int i=0;i
テスト入力が1100,2,3110,4,5111の場合、単純版の答えとは異なり、単純版は218で、正しいのは321であるべきである.