2011年4月28日木曜日

SRM 146 DIV1 | 257.77/300

格子の中に存在する長方形の数を答える問題。
[java]
public class RectangularGrid {
public long countRectangles(int width, int height) {
long wid = (long)width;
long hei = (long)height;
long allRect = (wid+1)*wid/2 * (hei+1)*hei/2;
long square = 0L;
for(int i=0; iheight ? 0 : height-i;
square += wlength * hlength;
}
long result = allRect - square;
return result;
}
}
[/java]

2011年4月26日火曜日

SRM 145 DIV1 | 122.11/250

数字列を割合に変換し、あまりをポイント高い順に振り分ける
[java]
public class Bonuses {
public int[] getDivision(int[] points) {
int total = 0;
int max = 0;
for(int point : points) {
total += point;
max = Math.max(max, point);
}

int[] division = new int[points.length];
for(int i = 0; i division[i] = (points[i] * 100) / total;

int divtotal = 0;
for(int div : division)
divtotal += div;

int rest = 100 - divtotal;
loop:while(max > 0 && rest>0) {
for( int i=0; i0; i++) {
int plus = (points[i]==max) ? 1 : 0;
division[i] += plus;
rest -= plus;
}
max--;
}
return division;
}
}
[/java]

2011年4月24日日曜日

SRM 160 DIV1 | 90.00/300

指定の形式で暗号化されたバイナリ列をもとに戻す問題

[java]
public class BinaryCode {
public String[] decode(String message) {
int DEGIT = message.length();

int Q[] = new int[DEGIT];
for(int i=0; i Q[i] = Integer.valueOf(message.substring(i, i+1));

int P[] = new int[DEGIT];
String bin0="0", bin1="1";

P[0] = 0;
for(int i=0; i if( i== 0)
P[i+1] = Q[i]-P[i];
else
P[i+1] = Q[i]-P[i]-P[i-1];
if( P[i+1] < 0) {
bin0="NONE";
break;
}
bin0 += ""+P[i+1];
}
if (DEGIT > 1)
bin0 = (Q[DEGIT-1] == P[DEGIT-2]+P[DEGIT-1]) ? bin0 : "NONE";
else
bin0 = (Q[DEGIT-1] == P[DEGIT-1]) ? bin0 : "NONE";


P[0] = 1;
for(int i=0; i if( i== 0)
P[i+1] = Q[i]-P[i];
else
P[i+1] = Q[i]-P[i]-P[i-1];
if( P[i+1] < 0) {
bin1="NONE";
break;
}
bin1 += ""+P[i+1];
}
if (DEGIT > 1)
bin1 = (Q[DEGIT-1] == P[DEGIT-2]+P[DEGIT-1]) ? bin1 : "NONE";
else
bin1 = (Q[DEGIT-1] == P[DEGIT-1]) ? bin1 : "NONE";

return new String[] {bin0, bin1};
}
}
[/java]

2011年4月22日金曜日

SRM 160 DIV2 |249.79/500

長方形の共通部分の面積を求める問題
[java]
public class Intersect {
public void main(String args[]) {
}
public int area(int[] x, int[] y) {
if(x.length % 2 == 1 || y.length %2 == 1 || x.length != y.length)
return 0;

int Xmax=10000, Xmin=-10000;
int Ymax=10000, Ymin=-10000;

for(int i=0; i int xmax = Math.max(x[i], x[i+1]);
int xmin = Math.min(x[i], x[i+1]);

Xmax = Math.min(Xmax, xmax);
Xmin = Math.max(Xmin, xmin);
}
for(int i=0; i int ymax = Math.max(y[i], y[i+1]);
int ymin = Math.min(y[i], y[i+1]);

Ymax = Math.min(ymax, ymax);
Ymin = Math.max(ymin, ymin);
}

int area = 0;
area = (Xmax - Xmin) * (Ymax - Ymin);
return area >= 0 ? area : 0;
}
}
[/java]