贪心算法
记录点滴。
1 /* 2 2015.6 HT 3 ACM Work_3 4 5 */ 6 7 //#include<stdio.h> 8 #include <iostream> 9 #include<algorithm> 10 using namespace std; 11 12 13 /* 14 FatMouse' Trade 15 老鼠有M磅猫食,可用F[i]的猫食换J[i]食物 16 */ 17 //struct bb 18 //{ 19 // double get, pay; 20 // double ave; 21 //}w[1000]; 22 // 23 //bool comp(bb x, bb y) 24 //{ 25 // if (x.ave > y.ave) 26 // return true; 27 // return false; 28 //} 29 // 30 //int main() 31 //{ 32 // int n, m, i; 33 // double sum; 34 // while (scanf_s("%d %d", &m, &n)) 35 // { 36 // if (m == -1 && n == -1) 37 // break; 38 // 39 // sum = 0; 40 // for (i = 0; i <= n - 1; i++) 41 // { 42 // // J[i] F[i] 43 // scanf_s("%lf %lf", &w[i].get, &w[i].pay); 44 // w[i].ave = w[i].get / w[i].pay; 45 // } 46 // sort(w, w + n, comp); 47 // for (i = 0; i <= n - 1; i++) 48 // { 49 // if (m >= w[i].pay) 50 // { 51 // sum = sum + w[i].get; 52 // m = m - int(w[i].pay); 53 // } 54 // else 55 // { 56 // sum = sum + w[i].ave * m; 57 // break; 58 // } 59 // } 60 // printf_s("%.3lf\n", sum); 61 // } 62 // return 0; 63 //} 64 65 66 67 /* 68 Moving Tables 69 将A房间桌子移到B房间,不论距离长短都需要十分钟 70 如果每次移动的桌子不共用走廊,就可以同时移动 71 1 3 5 7... 72 ---------- 73 2 4 6 8... 74 */ 75 //int main() 76 //{ 77 // int i, j, a[500], b[500], c[100], max, n, N, k, t; 78 // scanf_s("%d", &N); 79 // for (k = 1; k <= N; k++) 80 // { 81 // scanf_s("%d", &n); 82 // for (i = 0; i <= n - 1; i++) 83 // { 84 // // move from room number s to room number t 85 // scanf_s("%d%d", &a[i], &b[i]); 86 // if (a[i] % 2 != 0) 87 // a[i] = a[i] + 1; // 对门单双号房间共用一片走廊 88 // if (b[i] % 2 != 0) 89 // b[i] = b[i] + 1; 90 // // 排序 91 // if (a[i] > b[i]) 92 // { 93 // t = b[i]; 94 // b[i] = a[i]; 95 // a[i] = t; 96 // } 97 // } 98 // for (i = 0; i < 100; i++) 99 // { 100 // c[i] = 0; 101 // } 102 // for (i = 0; i <= n - 1; i++) 103 // { 104 // for (j = a[i] - 1; j <= b[i] - 1; j++) 105 // { 106 // c[j]++; 107 // } 108 // } 109 // max = 0; 110 // for (i = 0; i < 100; i++) 111 // { 112 // if (c[i] > max) 113 // { 114 // max = c[i]; 115 // } 116 // } 117 // printf_s("%d\n", max * 10); 118 // } 119 // return 0; 120 //} 121 122 123 124 /* 125 Doing Homework again 126 扣分最多的先安排,安排在没有任务的那天 127 */ 128 //#define MAX_num 1005 129 //struct homework 130 //{ 131 // int day; 132 // int score; 133 //}homework[MAX_num]; 134 // 135 //bool cmp(struct homework a, struct homework b) 136 //{ 137 // return a.score > b.score ? 1 : 0; 138 //} 139 // 140 //int main() 141 //{ 142 // int T; 143 // cin >> T; 144 // while (T--) 145 // { 146 // int i, visit[MAX_num] = { 0 }, homework_num = 0, score = 0, max_score = 0; 147 // cin >> homework_num; 148 // for (i = 0; i < homework_num; i++) 149 // cin >> homework[i].day; 150 // for (i = 0; i < homework_num; i++) 151 // { 152 // cin >> homework[i].score; 153 // max_score += homework[i].score; 154 // } 155 // sort(homework, homework + homework_num, cmp); 156 // for (i = 0; i < homework_num; i++) 157 // { 158 // int d = homework[i].day; 159 // for (; d >= 1; d--) 160 // { 161 // if (visit[d] == 0) 162 // break; 163 // } 164 // if (visit[d] == 0 && d > 0) //是否可以安排这天 165 // { 166 // visit[d] = 1; 167 // score += homework[i].score; 168 // } 169 // } 170 // cout << (max_score - score) << endl; //最后被扣的最少分数 171 // } 172 // 173 // return 0; 174 //} 175 176 177 178 /* 179 今年暑假不AC 180 整数n(n<=100)表示喜欢看的节目的总数 181 n行数据,每行Ti_s, Ti_e (1<=i<=n)别表示第i个节目的开始和结束时间 182 输出能完整看到的电视节目的个数 183 */ 184 //#define N 100 185 //struct node 186 //{ 187 // int s, e; 188 //}t[N]; 189 //int f[31]; 190 // 191 //int cmp(node i, node j) 192 //{ 193 // if (i.e == j.e) 194 // return i.s < j.s; 195 // return i.e < j.e; 196 //} 197 // 198 //int main() 199 //{ 200 // int n; 201 // int i, j, k; 202 // while (cin >> n && n) 203 // { 204 // for (i = 0; i < n; i++) 205 // cin >> t[i].s >> t[i].e; 206 // sort(t, t + n, cmp); 207 // memset(f, 0, sizeof(f)); 208 // 209 // int mx = -1; 210 // k = 0; 211 // for (i = 0; i < n; i++) 212 // { 213 // if (t[i].s >= mx) 214 // { 215 // mx = t[i].e; 216 // k++; 217 // } 218 // } 219 // cout << k << endl; 220 // } 221 // return 0; 222 //} 223 224 225 226 /* 227 Tian Ji -- The Horse Racing 228 输的一方将要给赢的一方200两黄金 229 贪心策略: 230 一、当田忌最快的马比国王最快的马快时,用田忌最快的马赢国王最快的马。 231 二、当田忌最快的马比国王最快的马慢时,用田忌最慢的马输给国王最快的马。 232 三、当田忌最快的马跟国王最快的马一样快时,分情况。 233 1、当田忌最慢的马比国王最慢的马快,那么用田忌最慢的马赢国王最慢的马 234 2、当田忌最慢的马比国王最慢的马慢,那么用田忌最慢的马输给国王最快的马 235 3、当田忌最慢的马跟国王最慢的马相等的时候,用田忌最慢的马跟国王最快的马比 236 */ 237 //int main(void) 238 //{ 239 // int num, sum; 240 // int tianJi[10], king[10]; 241 // while (cin >> num && num) 242 // { 243 // if (num == 0) 244 // break; 245 // 246 // sum = 0; 247 // int T = 0, TE = num - 1; 248 // int K = 0, KE = num - 1; 249 // for (int i = 0; i < num; i++) 250 // { 251 // cin >> tianJi[i]; 252 // } 253 // for (int j = 0; j < num; j++) 254 // { 255 // cin >> king[j]; 256 // } 257 // while (num--) 258 // { 259 // if (tianJi[T] > king[K]) 260 // { 261 // T++; 262 // K++; 263 // sum = sum + 200; 264 // } 265 // else if (tianJi[T] < king[K]) 266 // { 267 // TE--; 268 // K++; 269 // sum = sum - 200; 270 // } 271 // // 田忌最快的马跟国王最快的马一样快时,分情况 272 // else 273 // { 274 // if (tianJi[TE] > king[KE]) 275 // { 276 // TE--; 277 // KE--; 278 // sum = sum + 200; 279 // } 280 // else if (tianJi[TE] < king[KE]) 281 // { 282 // TE--; 283 // K++; 284 // sum = sum - 200; 285 // } 286 // else 287 // { 288 // if (tianJi[TE] > king[K]) 289 // { 290 // TE--; 291 // K++; 292 // sum = sum - 200; 293 // } 294 // else 295 // { 296 // TE--; 297 // K++; 298 // } 299 // } 300 // } 301 // } 302 // cout << sum << endl; 303 // } 304 // return 0; 305 //} 306 307 308 309 /* 310 Wooden Sticks 311 机器处理木板,机器重置需要1分钟,如果下一块木板的长度和质量均大于等于前一块的则机器无需重置 312 否则重置,一开始机器也要花费一分钟,求处理完木板的最短时间 313 */ 314 //#define N 5003 315 //struct WOOD 316 //{ 317 // int l,w; 318 // bool ok; 319 //}wood[N]; 320 // 321 //bool cmp(WOOD a, WOOD b) 322 //{ 323 // if (a.l < b.l) 324 // return true; 325 // else if (a.l > b.l) 326 // return false; 327 // else if (a.w <= b.w) 328 // return true; 329 // else 330 // return false; 331 // /*else if (a.l == b.l) 332 // { 333 // if (a.w <= b.w) 334 // return true; 335 // return false; 336 // } 337 // return false;*/ 338 //} 339 // 340 //int main() 341 //{ 342 // int T, n, i, j, setup; 343 // WOOD temp; 344 // cin >> T; 345 // while (T--) 346 // { 347 // cin >> n; 348 // for (i = 0; i < n; i++) 349 // { 350 // cin >> wood[i].l >> wood[i].w; 351 // wood[i].ok = 0; 352 // } 353 // sort(wood, wood + n, cmp); 354 // setup = 0; 355 // for (i = 0; i < n; i++) 356 // { 357 // if (!wood[i].ok) 358 // { 359 // setup++; 360 // temp = wood[i]; 361 // for (j = 0; j < n; j++) 362 // { 363 // if (!wood[j].ok && wood[j].l >= temp.l && wood[j].w >= temp.w) 364 // { 365 // wood[j].ok = 1; 366 // temp = wood[j]; 367 // } 368 // } 369 // } 370 // } 371 // cout << setup << endl; 372 // } 373 // return 0; 374 //} 375 376 377 378 /* 379 Fighting for HDU 380 出赛的顺序必须是从弱到强 381 每组数据占3行,第一行是一个整数n(n<100),表示每方上场队员的人数 382 后二行每行包含n个整数,分别依次表示中日两方人员的能力值,n为0的时候结束输入 383 */ 384 //#define maxn 105 385 //int a[maxn]; 386 //int b[maxn]; 387 // 388 //int main() 389 //{ 390 // int n, i, sum1, sum2; 391 // while (cin >> n && n) 392 // { 393 // for (i = 0; i < n; ++i) 394 // { 395 // cin >> a[i]; 396 // } 397 // for (i = 0; i < n; ++i) 398 // { 399 // cin >> b[i]; 400 // } 401 // sort(a, a + n); 402 // sort(b, b + n); 403 // 404 // sum1 = 0; 405 // sum2 = 0; 406 // for (i = 0; i < n; ++i) 407 // { 408 // if (a[i] > b[i]) 409 // { 410 // sum1 += 2; 411 // } 412 // else if (a[i] == b[i]) 413 // { 414 // sum1 += 1; 415 // sum2 += 1; 416 // } 417 // else 418 // { 419 // sum2 += 2; 420 // } 421 // } 422 // cout << sum1 << " vs " << sum2 << endl; 423 // } 424 // return 0; 425 //} 426 427 428 429 /* 430 悼念512汶川大地震遇难同胞——老人是真饿了 431 市场有m种大米,各种大米的单价和重量已知 432 输入C组测试用例,第一行是两个整数n和m(0<n<=1000,0<m<=1000)分别表示经费的金额和大米的种类 433 m行数据,每行包含2个整数p和w(1<=p<=25,1<=w<=100),分别表示单价和对应大米的重量 434 最多能采购多少重量的大米呢? 435 */ 436 struct nn 437 { 438 int p, w; 439 }a[1005]; 440 int cmp(nn a1, nn a2) 441 { 442 if (a1.p > a2.p) 443 return a1.p < a2.p; 444 return true; 445 } 446 int main() 447 { 448 int m, i, t; 449 double sum, n; 450 cin >> t; 451 while (t--) 452 { 453 // 经费金额 大米种类 454 cin >> n >> m; 455 for (i = 0; i<m; i++) 456 // 单价 重量 457 cin >> a[i].p >> a[i].w; 458 459 // 按单价从低到高排序 460 // 默认sort按升序排 461 sort(a, a + m, cmp); 462 sum = 0; 463 i = 0; 464 while (n > 0) 465 { 466 if (n >= a[i].p * a[i].w) 467 sum += a[i].w; 468 else 469 sum += n / a[i].p; 470 n -= a[i].p * a[i].w; 471 i++; 472 } 473 cout << sum << endl; 474 } 475 return 0; 476 }