UTPC 2011(05/14 12:00~17:00)
久し振りの投稿.■A プログラミングコンテスト
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n, m; void run(){ n=sc.nextInt(); m=sc.nextInt(); int max=0; for(int j=0; j<n; j++){ int a=0; for(int i=0; i<m; i++){ a+=sc.nextInt(); } max=max(max, a); } println(""+max); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
■B (iwi)
import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; void run(){ String s=sc.next(); int ans=0; if(s.length()%2==1){ if(!Character.isLetter(s.charAt(s.length()/2))){ ans++; } } boolean[][] check=new boolean[256][256]; check['i']['i']=true; check['w']['w']=true; check['('][')']=true; check[')']['(']=true; for(int i=0; i<s.length()/2; i++){ if(!check[s.charAt(i)][s.charAt(s.length()-1-i)]){ ans++; } } println(""+ans); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
■C [[iwi]]
全探索による解法.LCSのような解法もあるようです.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; void run(){ String ss=sc.next(); boolean[][] check=new boolean[256][256]; check['('][')']=true; check[')']['(']=true; check['{']['}']=true; check['}']['{']=true; check['['][']']=true; check[']']['[']=true; int k=ss.indexOf("iwi"); int m=k; int n=ss.length()-(k+3); String s=ss.substring(0, k); String t=ss.substring(k+3, ss.length()); // debug(m, n); // debug(s, t); int max=0; for(int sup1=0; sup1<1<<m; sup1++){ String s1=""; for(int i=0; i<m; i++){ if(((sup1>>i)&1)==1){ s1+=s.charAt(i); } } for(int sup2=0; sup2<1<<n; sup2++){ if(Integer.bitCount(sup1)==Integer.bitCount(sup2)){ String s2=""; for(int j=0; j<n; j++){ if(((sup2>>j)&1)==1){ s2+=t.charAt(j); } } boolean f=true; for(int i=0; i<s1.length(); i++){ f&=check[s1.charAt(i)][s2.charAt(s2.length()-1-i)]; } if(f){ // debug(s1, s2); max=max(max, s1.length()+3+s2.length()); } } } } println(max+""); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
■D 停止問題
BFSによる解法.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); int INF=1<<28; double EPS=1e-9; int n, m; char[][] cs; void run(){ n=sc.nextInt(); m=sc.nextInt(); cs=new char[n][m]; for(int j=0; j<n; j++){ String s=sc.next(); for(int i=0; i<m; i++){ cs[j][i]=s.charAt(i); } } int[] dx={0, 0, -1, 1}; int[] dy={-1, 1, 0, 0}; LinkedList<P> que=new LinkedList<P>(); boolean[][][][] visited=new boolean[m][n][16][4]; que.offer(new P(0, 0, 0, 3)); visited[0][0][0][3]=true; for(; !que.isEmpty();){ P p=que.poll(); // debug(p.x, p.y, p.mem, p.dir); if(cs[p.y][p.x]=='?'){ for(int i=0; i<4; i++){ P q=new P(p.x, p.y, p.mem, p.dir); q.dir=i; q.x=(q.x+dx[q.dir]+m)%m; q.y=(q.y+dy[q.dir]+n)%n; if(!visited[q.x][q.y][q.mem][q.dir]){ que.offer(q); visited[q.x][q.y][q.mem][q.dir]=true; } } continue; } P q=new P(p.x, p.y, p.mem, p.dir); switch(cs[p.y][p.x]){ case '<': q.dir=2; break; case '>': q.dir=3; break; case '^': q.dir=0; break; case 'v': q.dir=1; break; case '_': if(q.mem==0){ q.dir=3; }else{ q.dir=2; } break; case '|': if(q.mem==0){ q.dir=1; }else{ q.dir=0; } break; case '.': break; case '@': println("YES"); return; case '+': q.mem=(q.mem+1)%16; break; case '-': q.mem=(q.mem+15)%16; break; } if(Character.isDigit(cs[p.y][p.x])){ q.mem=cs[p.y][p.x]-'0'; } q.x=(q.x+dx[q.dir]+m)%m; q.y=(q.y+dy[q.dir]+n)%n; if(!visited[q.x][q.y][q.mem][q.dir]){ que.offer(q); visited[q.x][q.y][q.mem][q.dir]=true; } } println("NO"); } class P{ int x, y; int mem; int dir; P(int x, int y, int mem, int dir){ this.x=x; this.y=y; this.mem=mem; this.dir=dir; } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
■E ファーストアクセプタンス
System.arraycopyを何故か忘れていたため,競技中はWAでした.下は競技終了後のコード.ちなみに,bでソートすればいいので,aは関係ないです.import java.util.*; import java.lang.*; import java.math.*; import java.io.*; import static java.lang.Math.*; import static java.util.Arrays.*; public class Main{ Scanner sc=new Scanner(System.in); long INF=1L<<48; double EPS=1e-9; int n; R[] rs; void run(){ n=sc.nextInt(); rs=new R[n]; for(int i=0; i<n; i++){ int a=sc.nextInt(); int b=sc.nextInt(); rs[i]=new R(a, b); } sort(rs, new Comparator<R>(){ @Override public int compare(R r1, R r2){ if(r1.b!=r2.b){ return r1.b-r2.b; }else{ return r2.a-r1.a; } } }); long[][] dp=new long[n+1][n+1]; fill(dp[0], INF); dp[0][0]=0; for(int j=1; j<=n; j++){ System.arraycopy(dp[j-1], 0, dp[j], 0, n+1); for(int i=0; i<j; i++){ long t=dp[j-1][i]+rs[j-1].a; if(t<=rs[j-1].b){ dp[j][i+1]=min(dp[j][i+1], t); } } // debug(dp[j]); } for(int i=n; i>=0; i--){ if(dp[n][i]<INF){ println(i+""); break; } } } class R{ int a, b; R(int a, int b){ this.a=a; this.b=b; } } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } void print(String s){ System.out.print(s); } void println(String s){ System.out.println(s); } public static void main(String[] args){ // System.setOut(new PrintStream(new BufferedOutputStream(System.out))); new Main().run(); } }
■Result
400pt. 77th 途中で離脱してしまったので,簡単な問題しか解けず残念. Eは解法が合っていましたし,A~Dも1時間程度で解けていたので,わずかながらに成長しているようです. それにしても,沢山の強豪がいますね.今年のICPCが心配です.
0 件のコメント:
コメントを投稿