CodeChef May Cook-off 2011(1:00~3:30)
■Popular Rice Recipe
やるだけ.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(){ int caze=sc.nextInt(); for(int k=0; k<caze; k++){ int n=sc.nextInt(); HashMap<String, Integer> map=new HashMap<String, Integer>(); int ans=0; for(int i=0; i<n; i++){ String s=sc.next(); int p=sc.next().equals("+")?1:-1; if(map.containsKey(s)){ ans-=map.get(s); } ans+=p; map.put(s, p); } println(""+ans); } } void println(String s){ System.out.println(s); } void print(String s){ System.out.print(s); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } public static void main(String[] args){ new Main().run(); } }
■Distribute idlis Equally
シミュレーションなので,やるだけですが,時間内にACを取れませんでした.原因はPriorityQueueにおいてremove()を使っていたことです.
removeを使うと,計算量は,
O((A number of times)*n*(A number of test cases))
となり,TLEしてしまうのです.
実際,removeを使わずに実装すれば,
O((A number of times)*log(n)*(A number of test cases))
となるので,余裕で間に合います.
以下,Practiceにて通ったコード.
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; int[] a; void run(){ int t=sc.nextInt(); for(int j=0; j<t; j++){ n=sc.nextInt(); a=new int[n]; for(int i=0; i<n; i++){ a[i]=sc.nextInt(); } println(solve()+""); } } int solve(){ int sum=0; for(int e : a){ sum+=e; } if(sum%n!=0){ return -1; } PriorityQueue<R> que1=new PriorityQueue<R>(); PriorityQueue<R> que2=new PriorityQueue<R>(); for(int e : a){ que1.add(new R(e)); que2.add(new R(-e)); } int t; for(t=0;; t++){ R p=que1.poll(); for(;p.f;){ p=que1.poll(); } p.f=true; R q=que2.poll(); for(;q.f;){ q=que2.poll(); } q.f=true; int min=p.v; int max=-q.v; if(min==max){ break; } int r=(int)((max-min+1)/2.0); min+=r; max-=r; que1.add(new R(min)); que2.add(new R(-min)); que1.add(new R(max)); que2.add(new R(-max)); } return t; } class R implements Comparable<R>{ int v; boolean f; R(int v){ this.v=v; } @Override public int compareTo(R r){ return v-r.v; } } void println(String s){ System.out.println(s); } void print(String s){ System.out.print(s); } void debug(Object... os){ System.err.println(Arrays.deepToString(os)); } public static void main(String[] args){ new Main().run(); } }
■Result
----oこれは酷い….
0 件のコメント:
コメントを投稿