母親の誕生日祝い、Codeforces Round #171

今日は朝は某所の説明会。
帰宅後は夕方まで情報処理試験の勉強。
あんまり進まなかった。

夜は誕生日祝いということで、赤坂見附にある赤坂ざんまいというお店へ。
なんだかんだで3回目ですね。

あんまりお酒は飲まないので、食べ物中心となりました。
f0019846_15175645.jpg


f0019846_15182146.jpg


f0019846_15183375.jpg


f0019846_15184725.jpg


f0019846_15185814.jpg


f0019846_1519940.jpg


f0019846_15192252.jpg


f0019846_15193256.jpg


f0019846_15194993.jpg


f0019846_1520871.jpg


f0019846_15201693.jpg


f0019846_15203635.jpg


f0019846_15204532.jpg


f0019846_15205322.jpg


帰宅後はお祝いー。
f0019846_15213712.jpg


そしてゲーセンへ。
f0019846_1522117.jpg


f0019846_15221165.jpg


再度帰宅してCodeforces Round #171に参戦。

A問題は、0,0から右巻きに渦巻きを書いていって、
ある座標に行くのに何回ターンが必要かという問題。
シミュレートで問題ない。

import java.util.ArrayList;
import java.util.Scanner;

public class Main2 {

public static void main(String args[]){
Scanner input = new Scanner(System.in);
int x = input.nextInt();
int y = input.nextInt();
System.out.println(count(x,y));
}

public static int count(int x,int y){
int count = 0;
int sx = 0;
int sy = 0;
if(x == 0 && y == 0)return 0;
while(true){
if(count % 4 == 0){
for(int i = 0 ; i < count/2+1 ; i++){
sx++;
if(sx == x && sy == y)return count;
}
}else if(count % 4 == 1){
for(int i = 0 ; i < count/2+1 ; i++){
sy++;
if(sx == x && sy == y)return count;
}
}else if(count % 4 == 2){
for(int i = 0 ; i < count/2+1 ; i++){
sx--;
if(sx == x && sy == y)return count;
}
}else if(count % 4 == 3){
for(int i = 0 ; i < count/2+1 ; i++){
sy--;
if(sx == x && sy == y)return count;
}
}
count++;
}
}

}


B問題は、本を読める時間、それぞれの本にかかる時間があたえられていて、
あるところから順番に読む。読める最大値を求めよという問題。
単純シミュレートでこれも良い。
ある地点から読み始めてどこまで読めるか。
ただしn番目が終わったら1番目に戻るようなことはない。


import java.util.ArrayList;
import java.util.Scanner;

public class Main2 {

public static void main(String args[]){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int t = input.nextInt();
int[] a = new int[n];
for(int i = 0 ; i < n ; i++){
a[i] = input.nextInt();
}
System.out.println(count(n,t,a));
}

public static int count(int n,int t,int[] a){
int max = 0;

int time = t;
int count = 0;
int index = 0;
while(time > 0){
if(index == a.length){
break;
}else if(time-a[index] >= 0){
time -= a[index];
count++;
}else{
break;
}
index++;
}
max = Math.max(max,count);
for(int i = 0 ; i < a.length ; i++){
count--;
time += a[i];
while(time > 0){
if(index == a.length){
break;
}else if(time-a[index] >= 0){
time -= a[index];
count++;
}else{
break;
}
index++;
}
max = Math.max(max, count);
}
return max;
}

}


C問題は、数列が与えられていて、ある地点からある地点まで調べて行って、
増加→最大値→減少のようになっているかどうかを調べよという問題。

それぞれ頂点を調べて行って、減少中に座標を更新して、
増加した瞬間に、始点から終点をすべてその時のindexにして、始点をindexに更新する。


import java.util.ArrayList;
import java.util.Scanner;

public class Main2 {

public static void main(String args[]){
Scanner input = new Scanner(System.in);
int n = input.nextInt();
int m = input.nextInt();
int[] a = new int[n];
for(int i = 0 ; i < n ; i++){
a[i] = input.nextInt();
}
int[] st = new int[m];
int[] en = new int[m];
for(int i = 0 ; i < m ; i++){
st[i] = input.nextInt();
en[i] = input.nextInt();
}
count(n,m,a,st,en);
}

public static void count(int n,int m,int[] a,int[] st,int[] en){
int[] oknum = new int[a.length];
//boolean[] switcher = new boolean[a.length];
int stdown = -1;
int past = a[0];
int jindex = 0;
for(int i = 1 ; i < a.length ; i++){
if(a[i] < past){
stdown = i;
}else if(a[i] > past){
for(int j = jindex ; j < stdown ; j++){
if(oknum[j] == 0){
oknum[j] = i;
jindex = j;
}
}
}
past = a[i];
}
/*for(int i = 0 ; i < a.length ; i++){
System.out.println(oknum[i]);
}*/

for(int i = 0 ; i < m ; i++){
if(oknum[st[i]-1] < en[i] && oknum[st[i]-1] != 0){
System.out.println("No");
}else{
System.out.println("Yes");
}
}
}

}


Eは、ある数を2^kか-2^kを使って、できるだけ少ない項数で求めよという問題。

  by ddrer-yossi | 2013-03-04 23:13 | codeforces | Comments(0)

<< 某社後ランチ 後手後手の誕生日プレゼント選び >>

SEM SKIN - DESIGN by SEM EXE