- リスト内包表記
- 逆順リスト
- key(ソート基準)を指定したソート
N = int(raw_input())
wd = [raw_input() for line in range(N)]
wd = sorted(wd, key = lambda x : x[::-1])
for w in wd:
print w
N = int(raw_input())
wd = [raw_input() for line in range(N)]
wd = sorted(wd, key = lambda x : x[::-1])
for w in wd:
print w
def f(x):
if x == 'F':
return 0
return 4-ord(x)+ord('A')
N = int(raw_input())
str = raw_input()
p = map(lambda x : f(x), str)
p = 1.0 * reduce(lambda a, b : a+b, p) / N
print p
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
class BlurredDartboard {
public:
int minThrows(vector<int> points, int P) {
int ret = 1<<30;
int N = points.size();
// use the highest point visible
int maxv = *max_element(points.begin(), points.end());
if (maxv)
ret = (P+maxv-1)/maxv;
// use invisible points
bool visible[64] = {0};
REP(i, N)
if (points[i])
visible[points[i]] = 1;
vector<int> unvisible;
FOR (i, 1, N+1)
if (!visible[i])
unvisible.push_back(i);
int sum = accumulate(unvisible.begin(), unvisible.end(), 0);
int m = unvisible.size();
if (sum) {
int x = P/sum*m;
P %= sum;
// use the highest point for the points remained
if (maxv)
ret = min(ret, x+(P+maxv-1)/maxv);
// use invisible points for the points remained
int cnt = 0;
while (P > 0)
P -= unvisible[cnt++];
ret = min(ret, x + cnt);
}
return ret;
}
};
using namespace std;
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
int N;
long long x[500];
void printNums(unsigned long long use) {
bool fst = true;
REP (i, N) {
if (use & 1LL << i) {
if (fst)
fst = false;
else
cout << " ";
cout << x[i];
}
}
cout << endl;
}
void solve() {
unsigned long long use = 0;
boost::unordered_map<long long, unsigned long long> vis;
N = min(N, 50);
unsigned long long use2 = 0;
for (;;) {
use = use * 23 + 17542197;
long long sum = 0;
REP(i, N) if (use & 1LL<<i) sum += x[i];
if (sum && vis.count(sum)) {
use2 = vis[sum];
break;
}
vis[sum] = use;
}
printNums(use);
printNums(use2);
}
#define SUBMIT
int main() {
#ifdef SUBMIT
freopen("./test.in", "r", stdin);
freopen("./test.out", "w", stdout);
#endif
int T;
cin >> T;
REP(t, T) {
cout << "Case #" << t+1 << ":" << endl;
cerr << "Case #" << t+1 << ":" << endl;
cin >> N;
REP(i, N) cin >> x[i];
solve();
}
#ifdef SUBMIT
fflush(stdout);
cerr << "all done!" << endl;
#endif
return 0;
}
#define REP(i, n) for(int i=0; i<(int)(n); i++)
#define FOR(i, s, e) for (int i = (int)(s); i < (int)(e); i++)
typedef pair<double, pair<int, int> > Pr;
const int dx[] = {-1, 0, 1, 0};
const int dy[] = {0, 1, 0, -1};
const double INF = 1e100;
const double EPS = 1e-4;
int H, N, M;
int clg[128][128];
int flr[128][128];
double dist[128][128];
double enterTime(int x1, int y1, int x2, int y2) {
if (flr[x1][y1] > clg[x2][y2]-50)
return INF;
if (flr[x2][y2] > clg[x2][y2]-50)
return INF;
if (flr[x2][y2] > clg[x1][y1]-50)
return INF;
if (H <= clg[x2][y2]-50)
return 0;
return (H - (clg[x2][y2]-50)) / 10.0;
}
double solve() {
REP(i, N) REP(j, M) dist[i][j] = INF;
priority_queue<Pr, vector<Pr>, greater<Pr> > Q;
Q.push(make_pair(0, make_pair(0, 0)));
dist[0][0] = 0;
while (!Q.empty()) {
double t = Q.top().first;
int x = Q.top().second.first;
int y = Q.top().second.second;
Q.pop();
if (t > dist[x][y])
continue;
if (x == N-1 && y == M-1)
break;
REP(k, 4) {
int xx = x + dx[k];
int yy = y + dy[k];
if (xx < 0 || xx > N-1 || yy < 0 || yy > M-1)
continue;
double u = max(t, enterTime(x, y, xx, yy));
if (u == 0.0)
;
else if (H-10*u-flr[x][y] + EPS >= 20)
u += 1.0;
else
u += 10.0;
if (u < dist[xx][yy]) {
dist[xx][yy] = u;
Q.push(make_pair(u, make_pair(xx, yy)));
}
}
}
return dist[N-1][M-1];
}
#define SUBMIT
int main() {
#ifdef SUBMIT
freopen("./test.in", "r", stdin);
freopen("./test.out", "w", stdout);
#endif
int T;
cin >> T;
REP(t, T) {
cerr << "solving #" << t+1 << "..." << endl;
cin >> H >> N >> M;
REP(i, N) REP(j, M) cin >> clg[i][j];
REP(i, N) REP(j, M) cin >> flr[i][j];
double ret = solve();
printf("Case #%d: %.16lf\n", t+1,ret);
}
#ifdef SUBMIT
fflush(stdout);
cerr << "all done!" << endl;
#endif
return 0;
}
bool isEvenPermutation(vector<int> v) {
int exchange = 0;
for (int i = 0; i < (int)v.size(); i++) {
if (v[i] == i)
continue;
++exchange;
for (int j = i+1; j < (int)v.size(); j++) {
if (v[j] == i) {
swap(v[i], v[j]);
break;
}
}
}
return exchange % 2 == 0;
}
int orbitCount(vector<int> v) {
int cnt = 0;
for (int i = 0; i < (int)v.size(); i++) {
if (v[i] == -1)
continue;
++cnt;
int j = i;
while (v[j] != -1) {
int tmp = v[j];
v[j] = -1;
j = tmp;
}
}
return cnt;
}
long long power(long long x, long long y) {
long long ret = 1;
for (int i = 0; i < y; i++)
ret *= x;
return ret;
}
int main() {
long long color;
cin >> color;
vector<int> v;
for (int i = 0; i < 4; i++)
v.push_back(i);
int g = 0;
long long pattern = 0;
do {
if (isEvenPermutation(v)) {
++g;
pattern += power(color, orbitCount(v));
}
} while (next_permutation(v.begin(), v.end()));
assert(g > 0);
assert(pattern % g == 0);
cout << "Pattern: " << pattern/g << endl;
}