Java刷题的遇到输入106数据的题目用Scanner直接凉凉,在牛客上看到某位大佬的加速外挂,记录一下模板代码。
package my_acm; import java.io.*; import java.util.StringTokenizer; import java.math.BigInteger; public class Main { public static void main(String[] args) { InputStream inputStream = System.in;//InputStream是表示字节输入流的所有类的超类 OutputStream outputStream = System.out; //InputStream与System 没有关系.System.in是System 这个类的静态变量,只是in是InputStream类型的 InputReader sc = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); Task solver = new Task(); solver.solve(sc, out);//这里当作原来的Main函数,输入输出都在里面解决 out.close();//关闭输出流 } static class Task { public void solve(InputReader scan, PrintWriter out) { double ans=0; int t=scan.nextInt(); while(t!=0) { t--; /* * t组数据输入内容 */ } while(scan.hasNext()) { /* * 多组数据输入内容 */ } out.println(ans);//输出答案 } } //自己写出Scanner原本的输入语法,封装在InputReader类里 static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); //32768是输入缓冲区大小,随便设的 tokenizer = null; } public String next() { while (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } public boolean hasNext() { try { String string = reader.readLine(); if (string == null) { return false; } tokenizer = new StringTokenizer(string); return tokenizer.hasMoreTokens(); } catch (IOException e) { return false; } } public BigInteger nextBigInteger() {//大数 return new BigInteger(next()); } } }
https://ac.nowcoder.com/acm/contest/3570/L
思路:矩阵前缀和+二分
import java.io.*; import java.util.StringTokenizer; import java.math.BigInteger; public class Main { public static void main(String[] args) { InputStream inputStream = System.in;//InputStream是表示字节输入流的所有类的超类 OutputStream outputStream = System.out; //InputStream与System 没有关系.System.in是System 这个类的静态变量,只是in是InputStream类型的 InputReader sc = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); Task solver = new Task(); solver.solve(sc, out); out.close(); } static class Task { public boolean check(long[][] dp,int m,long max,int n) { for(int i=1;n-i+1>=m;i++) { for(int j=1;n-j+1>=m;j++) { if(dp[i+m-1][j+m-1]-dp[i+m-1][j-1]-dp[i-1][j+m-1]+dp[i-1][j-1]>=max) return true; } } return false; } public void solve(InputReader sc, PrintWriter out) { int n=sc.nextInt(); long k=sc.nextLong(); long[][] dp=new long[n+1][n+1]; long[][] v=new long[n+1][n+1]; for(int i=1;i<=n;i++) { for(int j=1;j<=n;j++) v[i][j]=sc.nextLong(); } for(int i=1;i<=n;i++)//矩阵前缀和 for(int j=1;j<=n;j++) dp[i][j]=dp[i-1][j]+dp[i][j-1]-dp[i-1][j-1]+v[i][j]; int ans=-1; int l=1; int r=n; while(l<=r) {//二分 int mid=(l+r)/2; if(check(dp,mid,k,n)) { ans=mid; r=mid-1; } else l=mid+1; } if(ans==-1) { out.println("I'm a Gold Chef!"); return ; } out.println(ans); } } //自己写出Scanner原本的输入语法,封装在InputReader类里 static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); tokenizer = null; } public String next() { while (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } public boolean hasNext() { try { String string = reader.readLine(); if (string == null) { return false; } tokenizer = new StringTokenizer(string); return tokenizer.hasMoreTokens(); } catch (IOException e) { return false; } } public BigInteger nextBigInteger() { return new BigInteger(next()); } } } L
https://ac.nowcoder.com/acm/contest/3402/L
思路:贪心
package my_acm; import java.io.*; import java.util.Arrays; import java.util.StringTokenizer; import java.math.BigInteger; public class Main { public static void main(String[] args) { InputStream inputStream = System.in;//InputStream是表示字节输入流的所有类的超类 OutputStream outputStream = System.out; //InputStream与System 没有关系.System.in是System 这个类的静态变量,只是in是InputStream类型的 InputReader scan = new InputReader(inputStream); PrintWriter out = new PrintWriter(outputStream); Task solver = new Task(); solver.solve(scan, out);//这里当作原来的Main函数,输入输出都在里面解决 out.close();//关闭输出流 } static class Task { public void solve(InputReader scan, PrintWriter out) { while(scan.hasNext()) { long m; int n=scan.nextInt(); m=scan.nextLong(); long [] c=new long[n+1]; long sumb=0,suma=0; for(int i=0;i<n;i++) { long a,b; a=scan.nextLong(); b=scan.nextLong(); c[i]=a-b; sumb+=b; suma+=a; } int ans=0;//压缩数量 if(sumb>m) ans=-1; else{ Arrays.sort(c,0,n); for(int i=n-1;i>=0;i--) { if(suma<=m) { break; } suma-=c[i]; ans++; } } out.println(ans); } } } //自己写出Scanner原本的输入语法,封装在InputReader类里 static class InputReader { public BufferedReader reader; public StringTokenizer tokenizer; public InputReader(InputStream stream) { reader = new BufferedReader(new InputStreamReader(stream), 32768); //32768是输入缓冲区大小,随便设的 tokenizer = null; } public String next() { while (tokenizer == null || !tokenizer.hasMoreTokens()) { try { tokenizer = new StringTokenizer(reader.readLine()); } catch (IOException e) { throw new RuntimeException(e); } } return tokenizer.nextToken(); } public int nextInt() { return Integer.parseInt(next()); } public long nextLong() { return Long.parseLong(next()); } public double nextDouble() { return Double.parseDouble(next()); } public boolean hasNext() { try { String string = reader.readLine(); if (string == null) { return false; } tokenizer = new StringTokenizer(string); return tokenizer.hasMoreTokens(); } catch (IOException e) { return false; } } public BigInteger nextBigInteger() {//大数 return new BigInteger(next()); } } }