Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
最简单的算法 ^_^, 先除2直到不划算或者不行为止#include <stdio.h> #include <string.h> typedef struct { int v; int p1, p2; char name[17]; }my_info; int my_cmp(void * a, void * b) { my_info * x = (my_info *)a; my_info * y = (my_info *)b; if (x->v < y->v) return -1; else if (x->v > y->v) return 1; else { return strcmp(x->name, y->name); } } int n, m, count; my_info l[100]; int div_d(int a, int b) { int d = a/b; if (d * b == a) return d; else return d+1; } void solve() { int i; int min_n; for (i=0; i<count; ++i) { my_info * t = &(l[i]); int c = n; if (t->p1 <= 0) { t->v = 0; continue; } min_n = div_d(2*t->p2, t->p1); t->v = 0; while (c >= min_n && (c>>1) >= m) { c >>= 1; t->v += t->p2; } t->v += (c-m)*t->p1; } qsort(l, count, sizeof(my_info), my_cmp); } void print_result() { int i; for (i=0; i<count; ++i) { my_info * t = &(l[i]); printf("%s %d\n", t->name, t->v); } } int main() { int cases, i, j; char line[256]; scanf("%d\n", &cases); for (i=0; i<cases; ++i) { scanf("%d %d %d\n", &n, &m, &count); for (j=0; j<count; ++j) { char * tmp_p; gets(line); tmp_p=strchr(line, ':'); memcpy(l[j].name, line, tmp_p-line); l[j].name[tmp_p-line] = '\0'; sscanf(tmp_p+1, "%d,%d", &l[j].p1, &l[j].p2); } solve(); printf("Case %d\n", i+1); print_result(); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator