首页 > 代码库 > BZOJ1110 [POI2007]砝码Odw
BZOJ1110 [POI2007]砝码Odw
话说这题。。。是贪心、、、
Orz JCVB(虽然这是hzwer的blog。。。Jcvb的不知道则么回事打不开。。。囧)
1 /************************************************************** 2 Problem: 1110 3 User: rausen 4 Language: C++ 5 Result: Accepted 6 Time:984 ms 7 Memory:1588 kb 8 ****************************************************************/ 9 10 #include <cstdio>11 #include <cctype>12 #include <algorithm>13 14 using namespace std;15 const int N = 100005;16 const int M = 55;17 18 int n, m, tot;19 int a[N], b[N];20 int c[M], cnt[M];21 22 inline int read() {23 int x = 0, sgn = 1;24 char ch = getchar();25 while (!isdigit(ch)) {26 if (ch == ‘-‘) sgn = -1;27 ch = getchar();28 }29 while (isdigit(ch)) {30 x = x * 10 + ch - ‘0‘;31 ch = getchar();32 }33 return sgn * x;34 }35 36 37 bool check(int now) {38 int i;39 for (i = now + 1; i <= tot; ++i)40 if (cnt[i]) {41 cnt[now] += c[i] / c[now];42 --cnt[i];43 return 1;44 }45 return 0;46 }47 48 int main() {49 int i, j, now;50 n = read(), m = read();51 for (i = 1; i <= n; ++i)52 a[i] = read();53 for (i = 1; i <= m; ++i)54 b[i] = read();55 sort(b + 1, b + m + 1);56 for (i = 1; i <= m; ++i)57 if (b[i] != b[i - 1]) c[++tot] = b[i];58 for (i = 1; i <= n; ++i)59 for (j = tot; j; --j)60 while (c[j] <= a[i])61 a[i] -= c[j], ++cnt[j];62 now = 1;63 for (i = 1; i <= m; ++i) {64 while (b[i] > c[now]) ++now;65 if (cnt[now]) --cnt[now];66 else if (check(now)) --cnt[now];67 else {68 printf("%d\n", i - 1);69 return 0;70 }71 if (i == m) printf("%d\n", m);72 }73 return 0;74 }
BZOJ1110 [POI2007]砝码Odw
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。