tozangezan's diary

勝手にソースコードをコピペして利用しないでください。

SRM 481 Div2

久しぶり(1ヶ月ぶり)のSRM。理想のパターン。
250: CircleMarket
実際に回るだけ。なぜか時間がかかってしまいました。

public class CircleMarket{
	public int makePurchases(int[] a,int []b ,int c){
		boolean buy[]=new boolean[a.length];
		int d=b.length;
		for(int i=0;i<b.length;i++){
			for(int j=0;(d*j+i)*c<=b[i];j++){
				if((d*j+i)*c>=a[i]){buy[i]=true;break;}
			}
		}
		int ret=0;
		for(int i=0;i<b.length;i++)if(buy[i])ret++;
		return ret;
	}
}

500: ChickenOracle
こういう問題は苦手。必要十分条件なのか必要条件なのか十分条件なのかわからない。たぶんif書き間違えたんだろうな。
Div1に居たらこれが250になるんですね。きついです。
↓は落ちる

public class ChickenOracle{
	public String theTruth(int a,int b,int c,int d){
		boolean egg=false;
		boolean niwatori=false;
		//TAKESHI
		for(int i=0;i<a;i++){
			int A,B,C,D;
			C=i;
			B=c-C;
			D=d-C;
			A=b-C;
			if(A+B+C+D==a&&A>=0&&B>=0&&C>=0&&D>=0){
				egg=true;
				System.out.println(i+" EGG");
			}
		}
		//TAKESHI
		for(int i=0;i<a;i++){
			int A,B,C,D;
			D=i;
			A=c-D;
			C=d-D;
			B=a-b-D;
			if(A+B+C+D==a&&A>=0&&B>=0&&C>=0&&D>=0){
				niwatori=true;
				System.out.println(i+" CHICKEN");
			}
		}
		if(niwatori&&egg)return "Ambiguous";
		else if(niwatori)return "The chicken";
		else if(egg)return "The egg";
		else return "The oracle is a lie";
	}
}

900: BatchSystem
よく見る問題。普通にやるだけ。ってのも難だな〜
HashMapにString,Longで保存して足し算かなんかをやって小さい順に取り出していく。人数は50人なのでてきと〜にたくさんループをまわしても間に合ってしまう。
ただしintを使うと終わるよ!! (実際私はResubmitしたのですが)
でもどうしてこんなにめちゃくちゃなソースコードで通ったのだろうか。

import java.util.*;
public class BatchSystem{
	public int[] schedule(int[] a,String[] b){
		String [] c=new String[a.length];
		int index=0;
		HashMap<String,Long> h=new HashMap<String,Long>();
		for(int i=0;i<a.length;i++){
			if(h.containsKey(b[i]))h.put(b[i],h.get(b[i])+(long)a[i]);
			else{
				h.put(b[i],(long)a[i]);
				c[index++]=b[i];
			}
		}
		int now=0;
		int ret[]=new int[a.length];
		for(int i=0;i<index;i++){
			long max=999999999999L;
			String maxval="";
			int kesu=0;
			for(int j=0;j<index;j++){
				if(max>h.get(c[j])){
					max=h.get(c[j]);
					kesu=j;
					maxval=c[j];
				}
			}
			h.put(maxval,9999999999999L);
			System.out.println(maxval);
			for(int j=0;j<a.length;j++){
				if(maxval.equals(b[j]))ret[j]=now++;
			}
		}
		int honto[]=new int[a.length];
		for(int i=0;i<a.length;i++){
			honto[ret[i]]=i;
		}
		return honto;
	}
}

結果:
234.63 + 0.00(STF) + 449.62 - 25.00 = 659.25
24位 1019 -> 1167
なぜかtozangezanになってしまったことは気にしない方針で。

次二完したらDiv1ですかね。