Pku JudgeOnline

ゼミが休みになったので少し解く.とりあえず順位をひとつあげる.とりあえず100位と34問差があるので当分2ページ目には載れそうだが,あと100解いてもまだ2ページ目なんだよな.

解いた問題は以上

ソースは以下の通り

Pku3117

いろいろ情報が入っているけど,単なる鶴亀算

import java.util.Scanner;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int t = sc.nextInt();
			int n = sc.nextInt();
			if(t==0&&n==0)break;
			int sum = 0;
			for(int i=0;i<t;i++){
				sc.next();
				sum+=sc.nextInt();
			}
			System.out.println(3*n-sum);
		}
	}
}

Pku3186

DP

import java.util.*;

public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int arr[] = new int[n];
		for(int i=0;i<n;i++){
			arr[i] = sc.nextInt();
		}
		int memo[][] = new int[n+1][n+1];
		for(int i=0;i<memo.length;i++){
			Arrays.fill(memo[i], Integer.MIN_VALUE);
		}
		memo[0][0] = 0;
		int max = Integer.MIN_VALUE;
		for(int a=1;a<=n;a++){
			for(int l=0;l<=a;l++){
				int r = a - l;
				if(l!=0)memo[l][r] = Math.max(memo[l][r], memo[l-1][r] + arr[l-1]*a);
				if(r!=0)memo[l][r] = Math.max(memo[l][r], memo[l][r-1] + arr[n-r]*a);
				max = Math.max(max, memo[l][r]);
			}
		}
		System.out.println(max);
	}
}

Pku3191

10進数を-2進数に変換しろという問題,再帰の部分がうまいこと一つにまとまらない.あとmainの部分とfの部分の統一がとれていないから余計な0を取り除く処理が必要になっている.

import java.util.*;

public class Main {
	static void f(long val,long base,List<Integer> lst){
		if(base==0)return ;
		if(base>0 && val >(base -1)/3){
			lst.add(1);
			f(val-base,base/(-2),lst);
		}else if(base<0 && -val >(-base-2)/3){
			lst.add(1);
			f(val-base,base/(-2),lst);			
		}else{
			lst.add(0);
			f(val,base/(-2),lst);
		}
	}
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		long val = sc.nextLong();
		List<Integer> lst = new LinkedList<Integer>();
		for(long base = 1;;base*=-2){
			if(val*base>=0 && base-val>=0){
				f(val,base,lst);
				boolean flag = lst.size()==1?true:false;
				for(int i:lst){
					if(i==1)flag = true;
					if(flag)System.out.print(i);
				}
				System.out.println();
				break;
			}
		}
	}
}

Pku2868

こういう群数列っぽい問題はよく出るので,体系的に解く方法をもっておきたいんだけど,なんかその場限りで解いている気がする.

import java.util.Scanner;
public class Main {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		while(true){
			int n = sc.nextInt();
			int q= sc.nextInt();
			if(n==0 && q==0)break;
			String arr[] = new String[n];
			for(int i=0;i<n;i++)arr[i] = sc.next();
			for(int i=0;i<q;i++){
				long k = sc.nextLong();
				int index = sol(n,k);
				System.out.println(arr[index]);
			}
			System.out.println();
		}
	}	
	static int sol2(long n,long k,long index){
		long a = index/k;
		long i = k - (index - a * k) -1;
		for(long j = 0; j < i;j++){
			a /= n;
		}
		return (int)(a % n);
	}
	static int sol(int n,long k){
		if(n==1)return 0;
		long base = n;
		long sum = 0;
		for(int i = 1;;i++){
			sum += base*i ;
			if(sum>=k){
				long index = k-(sum-base*i);
				return sol2(n,i,index -1);
			}
			base *= n;
		}
	}
}