A. Optimal Currency Exchange
题意:拥有n卢比,d卢比换一美元,e卢比换一欧元,美元面额1 , 2, 5, 10, 20, 50, 100 欧元面额5 , 10, 20, 50, 100, 200,求手中最小的剩余卢比数
思路:美元可以都换做一美元处理,欧元可以用5处理,枚举一美元的数量,把min存下来
input
100 60 70
output
40
input
410 55 70
output
View Code
1 package The583; 2 3 import java.util.HashSet; 4 import java.util.Scanner; 5 6 public class MainB { 7 public static void main(String args[]) 8 { 9 Scanner sc=new Scanner(System.in); 10 HashSet<String> set=new HashSet<String>(); 11 int n=sc.nextInt(),m=sc.nextInt(),k=sc.nextInt(); 12 int sum=0; 13 for(int i=0;i<=n&&i<=k;i++) 14 if(k-i<=m) 15 { 16 sum++;//System.out.println(i+" "+(k-i)); 17 set.add(i+" "+(k-i)); 18 } 19 for(int i=0;i<=m&&i<=k;i++) 20 if(k-i<=n) 21 { 22 if(set.contains((k-i)+" "+i)) 23 continue; 24 sum++;//System.out.println(i+" "+(k-i)); 25 set.add((k-i)+" "+i); 26 } 27 System.out.println(sum); 28 } 29 30 }
5
input
600 60 70
output
0
B. Badges
题意:n男孩,m女孩,k个名额求不同的男女组合数
思路:直接枚举就好,(我还写了个set判重,好像写复杂了)
input
5 6 3
output
4
input
5 3 5
output
4
1 package The583; 2 3 import java.util.Arrays; 4 import java.util.Scanner; 5 6 public class MainA { 7 public static void main(String args[]) 8 { 9 Scanner sc=new Scanner(System.in); 10 int n=sc.nextInt(),d=sc.nextInt(),e=sc.nextInt()*5; 11 int min=n%e;//换0美元后其他的全换欧元剩下的卢比 12 for(int i=1;d*i<=n;i++) 13 { 14 min=Math.min(min, (n-(d*i))%e);//n-换的美元,剩下的换欧元 15 } 16 System.out.println(min); 17 } 18 19 }
C. Bad Sequence
题意:给你n/2对括号,最多交换2个的位置,问是否可以使其合法
思路:如果n为奇数直接输出NO,“(”不用管,记录数量就行,“)”记录数量,然后和left比较,如果left小于right,将“)”变为“(”,用cnt记录变的次数,超过一次直接输出No,最后判断即可:注意当cnt==1时,left是比right多1的
input
2 )(
output
Yes
input
3 (()
output
No
input
Copy
2 ()
output
Yes
input
10 )))))(((((
output
No
1 package The583; 2 3 import java.util.Scanner; 4 5 public class MainC{ 6 public static void main(String args[]) 7 { 8 Scanner sc=new Scanner(System.in); 9 int n=sc.nextInt(); 10 String s=sc.next(); 11 if(n%2!=0) 12 System.out.println("No"); 13 else 14 { 15 boolean bool=true; 16 int left=0,right=0,cnt1=0; 17 for(int i=0;i<n&&bool;i++) 18 { 19 if(s.charAt(i)=='(') 20 { 21 left++; 22 23 } 24 else 25 { 26 right++; 27 if(left<right) 28 { 29 left++; 30 if(cnt1==1) 31 { 32 bool=false; 33 } 34 cnt1++; 35 } 36 37 38 } 39 } 40 if(bool) 41 { 42 if(left==right) 43 System.out.println("Yes"); 44 else if(cnt1==1&&left-right==1) 45 System.out.println("Yes"); 46 else 47 System.out.println("No"); 48 } 49 else 50 System.out.println("No"); 51 } 52 53 } 54 55 }
D. Treasure Island
题意:一个地图,#代表不能走,要从左上角走到右下角,每次只能向下或者向右, 求最少放几个障碍物使其走不到右下角
思路:答案只有0,1,2这三种,随便找一条路,并标记,如果走不到输出0,否走再走一遍dfs,这次不走之前标记过的点,如果可以走到输出2,否则输出1
input
2 2 .. ..
output
2
input
4 4 .... #.#. .... .#..
output
1
input
3 4 .... .##. ....
output
2
1 package The583; 2 3 import java.util.Scanner; 4 5 public class MainD { 6 static int n,m; 7 static char map[][]; 8 static boolean vis[][]; 9 public static void main(String args[]) 10 { 11 Scanner sc=new Scanner(System.in); 12 n=sc.nextInt();m=sc.nextInt(); 13 vis=new boolean[n][m]; 14 map=new char[n][m]; 15 for(int i=0;i<n;i++) 16 { 17 map[i]=sc.next().toCharArray(); 18 } 19 if(!dfs(0,0)) 20 System.out.println(0); 21 else 22 { 23 vis[n-1][m-1]=false;//第一次dfs把这里赋值true了; 24 if(dfs(0,0)) 25 System.out.println(2); 26 else 27 System.out.println(1); 28 } 29 } 30 public static boolean dfs(int x,int y) 31 { 32 if(x==n-1&&y==m-1) 33 { 34 return true; 35 } 36 int dx=x,dy=y+1; 37 if(dy<m&&map[dx][dy]!='#'&&!vis[dx][dy]) 38 { 39 vis[dx][dy]=true; 40 if(dfs(dx,dy)) 41 return true; 42 } 43 dx=x+1;dy=y; 44 if(dx<n&&map[dx][dy]!='#'&&!vis[dx][dy]) 45 { 46 vis[dx][dy]=true; 47 if(dfs(dx,dy)) 48 return true; 49 } 50 return false; 51 } 52 }