tozangezan's diary

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

SRM過去問 SRM480 Div2

今日も過去問をやってみた。この回は英語力を競う大会だったようだ。

250: CryptoGraphy
問題文読めないけど、入出力から大体分かった。こんなことやってるから遅いんだ。
この能力だけは大学生や外国人には勝てない。
どうやらintの配列が与えられるからどこか1足してすべての積を最大化する問題らしい。そしてlongに収まる。やるだけ。

public class Cryptography{
	public long encrypt(int[] a){
		long ans=1;
		int min=999999999;
		for(int i=0;i<a.length;i++){
			if(min>a[i])min=a[i];
		}
		for(int i=0;i<a.length;i++)ans*=a[i];
		return ans/min*(min+1);
	}
}

500: InternetSecurity
非常に難しい。本番だったら無理かも。英語が。
まあ内容分かっても結構いつもより難しい感じがしました。
危険なサイトを判別する問題。いけない単語のリストが与えられて、何個以上含まれると危険なサイトだよってとこまでは分かるんだけど、危険なサイトの単語は全部いけない単語になるよってのは問題文と入出力からは読み取れない。
まあ書いちゃえばすぐ通るけど。
時間食いすぎた。それでも一発AC来るから不思議。

import java.util.*;
public class InternetSecurity{
	public String[] determineWebsite(String[]a,String[]b,String[]c,int d){
		int[] e=new int[a.length];
		String[] g=new String[1000000];
		for(int i=0;i<c.length;i++)g[i]=c[i];
		int now=c.length;
		boolean[] m=new boolean[a.length];
		for(int h=0;h<a.length;h++){
		for(int i=0;i<a.length;i++){
			e[i]=0;
			String[] f=b[i].split(" ");
			for(int j=0;j<f.length;j++){
				for(int k=0;k<now;k++){
					if(f[j].equals(g[k]))e[i]++;
				}
			}
			if(e[i]>=d){
				System.out.println("Called");
				m[i]=true;
				for(int j=0;j<f.length;j++){
					boolean takeshi=false;
					for(int k=0;k<now;k++)if(g[k].equals(f[j]))takeshi=true;
					if(!takeshi)g[now++]=f[j];
				}
			}
		}
		System.out.println(now);
		}
		int size=0;
		for(int i=0;i<a.length;i++)if(m[i])size++;
		String[] ret=new String[size];
		int index=0;
		for(int i=0;i<a.length;i++)if(m[i])ret[index++]=a[i];
		return ret;
	}
}

900: SignalIntelligence
題意を教えてください。そしたら解けるかも。
正直言ってプログラミング言語の選択なんていらないですから問題文の言語を選択させてください。

246.08 + 269.08 + 0.00 = 515.16
「500開く→Test通らない→900開く」の流れを「500開く→Test通らない→問題文読む」にすればもっと点数いったはず。
でもこれじゃレーティング30くらいしか上がらない。