GoogleCodeJam2012 1B A "Safety in Numbers"
問題: https://code.google.com/codejam/contest/1836486/dashboard#s=p0
最低点の人が複数入れば最低点の人がeliminatedされないということだったので2人以上で同じ最低点になるように計算してった.
import java.util.Arrays; import java.util.Comparator; import java.util.Scanner; import java.io.File; public class A { public static void main(String[] args) throws Exception { Scanner s = new Scanner(new File("A-large.in")); for (int t = 1, T = s.nextInt(); t <= T; ++t) { int n = s.nextInt(); int a[][] = new int[n][2], x = 0; for (int i = 0; i < n; ++i) { a[i][0] = i; x += a[i][1] = s.nextInt(); } Arrays.sort(a, new Comparator<int[]>() { @Override public int compare(int[] o1, int[] o2) { return o1[1] - o2[1]; } }); int m = 2; while (m < n) { double sum = x; for (int i = 0; i < m; ++i) { sum += a[i][1]; } if (sum / m <= a[m][1]) { break; } ++m; } double sum = x; for (int i = 0; i < m; ++i) { sum += a[i][1]; } double[] y = new double[n]; for (int i = 0; i < m; ++i) { y[a[i][0]] = 100 * (sum / m - a[i][1]) / x; } String result = "Case #" + t + ": "; for (double Y : y) { result += String.format("%.5f ", Y); } System.out.println(result.trim()); } } }
追記
ついでにGoでも書いてみた.中身はJavaのやつと一緒.
package main import ( "fmt" "github.com/nise-nabe/fastio" "os" "sort" "strings" ) type Pair struct { Index int Value float64 } type Pairs []*Pair func (p Pairs) Len() int { return len(p) } func (p Pairs) Swap(i, j int) { p[i], p[j] = p[j], p[i] } func (p Pairs) Less(i, j int) bool { if p[i].Value == p[j].Value { return p[i].Index < p[j].Index } return p[i].Value < p[j].Value } func main() { s := fastio.NewInOut(os.Stdin, os.Stdout) for t, T := 1, s.Next(); t <= T; t++ { n := s.Next() a, x := Pairs{}, 0. for i := 0; i < n; i++ { a = append(a, &Pair{i, float64(s.Next())}) x += a[i].Value } sort.Sort(a) m, sum := 2, 0. for m < n { sum = x for i := 0; i < m; i++ { sum += a[i].Value } if sum/float64(m) <= a[m].Value { break } m++ } sum = x for i := 0; i < m; i++ { sum += a[i].Value } y := make([]float64, n) for i := 0; i < m; i++ { y[a[i].Index] = 100. * (sum/float64(m) - a[i].Value) / x } result := make([]string, n) for i, v := range y { result[i] = fmt.Sprintf("%.5f", v) } s.Println("Case #", t, ": ", strings.Join(result, " ")) } s.Flush() }