白駿2839号:砂糖を送る




問題の説明

  • 5と3にNを加えることができるかどうか、できれば最低の5と3をどう使うかが問題です.
  • 方法

  • リュックサックの問題のように考えて解くことができます.
  • 3より5を入れる方が有利なのでなるべく多めに5を入れましょう
  • 5を最も多く、残りの空間(rest)を3で割った場合、Nを作成できることを示します.
  • restが3に分割されない場合、5が減算されます.5を除いて、残りのスペースが3で除去されていることを確認してください.
  • 5を全部取り除くまで.5を全て取り除いたが空間が3に分けられなければ,この数Nは3と5にはならない.
  • 正解

    import java.util.*;
    
    public class Main {
    	public static void main(String[] args) {
    		Scanner sc = new Scanner(System.in);
    		int N = sc.nextInt();
    		int cnt = 0;
    		cnt += N/5; //가방을 5키로짜리로 채움
    		int rest =N%5; //가방에 남은 공간
    		while (rest<=N) {//5를 전부 뺄때까지 반복합니다.
    			if(rest%3 == 0) {
    				cnt+=(rest)/3;
    				break;
    			}else {
    				rest +=5;
    				cnt--;
    			}
    		}
            
    		if(rest>N) {//입력값이 4인 경우 9>4가 됩니다.
    			System.out.println(-1);
    		}else {			
    			System.out.println(cnt);
    		}
    	}
    }
    
    //1주일 뒤에 다시한번 풀어봤습니다.
    import java.io.*;
    
    class Main {
    	public static void main(String[] args) throws IOException {
    		Scanner sc = new Scanner(System.in);
    		int N = sc.nextInt();
    		boolean token = true;
    
    		int rest = N%5;
            //i는 뺄 설탕의 개수입니다 0개부터 시작해 N/5까지 5kg설탕을 빼봅니다.
    		for (int i = 0; i <= (int)N/5; i++) { 
    			if((rest+5*i)%3 == 0) { // rest+5*i는 i개의 5kg설탕을 뺀 뒤 채워야하는 무게입니다.
                	// (N/5)-i는 5kg설탕의 개수, (rest+5*i)/3은 3kg설탕의 개수입니다.
    				System.out.println((int)(N/5)-i + (int)(rest+5*i)/3);
                    // -1출력을 방지하기 위한 token입니다.
    				token = false;
    				break;
    			}
    		}
    
    		if(token) {
    			System.out.println(-1);			
    		}
    	}
    	
    
    }
    
    

    その他

  • 最初に5または3の集合を作成したとき、残りの数も別々に使えると思います.(無効なアクセス例)
  • 整数論で近づくと難しくなります.
  • 問題を解くのにちょうどいい方法を見つけたいです.この問題や完全な探求のように、直接実施するときに探した問題はうまく答えられない.△私は今までこのような方法で接近しようとは思わなかった.