import java.util.HashSet;import java.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args){
Scanner in =newScanner(System.in);while(in.hasNext()){
String s0 = in.nextLine();
String[] s00 = s0.split(" ");int house=Integer.parseInt(s00[0]);int time=Integer.parseInt(s00[1]);
String s = in.nextLine();
String[] s1 = s.split(" ");//炸弹出现的数组int[] nums=newint[time];for(int i =0; i < time; i++){
nums[i]=Integer.parseInt(s1[i]);}int res=0;//表示消耗的能量int currenthouse=1;
HashSet<Integer> set =newHashSet<>();for(int i =0; i < time; i++){if(currenthouse==nums[i]){//房间要爆炸
set.clear();
set.add(nums[i]);//爆炸的加进去
res++;//必须换房间,换的房间不知道
currenthouse=-1;//暂且不确定去哪个}elseif(currenthouse!=nums[i]&&set.size()<house-1){
set.add(nums[i]);}elseif(currenthouse!=nums[i]&&!set.contains(nums[i])){
set.clear();
set.add(nums[i]);//爆炸的加进去
res++;//必须换房间,换的房间不知道
currenthouse=-1;//暂且不确定去哪个}}
System.out.println(res);}}}
正确的思路是动态规划如下
import java.util.Arrays;import java.util.Scanner;publicclassMain{publicstaticvoidmain(String[] args){
Scanner in =newScanner(System.in);int n=in.nextInt();//表示共n个房间int m=in.nextInt();//表示游戏共持续m秒int[] bomb=newint[m+1];for(int i =1; i <=m; i++){
bomb[i]=in.nextInt();}int[][] dp=newint[m+1][n+1];//表示游戏持续到第i秒,小美指向j个房间for(int i =0; i <=m; i++){
Arrays.fill(dp[i],Integer.MAX_VALUE-10000);}
dp[1][1]=0;//初始,第一秒在第一个房间不消耗for(int i =2; i <=m; i++){for(int j =1; j <=n; j++){if(bomb[i]==j)continue;for(int k =1; k <=n; k++){
dp[i][j]=Math.min(dp[i-1][k]+(j==k?0:1),dp[i][j]);}}}int res=Integer.MAX_VALUE;for(int i =1; i <=n; i++){
res=Math.min(res,dp[m][i]);}
System.out.println(res);}}