zoukankan      html  css  js  c++  java
  • 贪心算法

    记录点滴。

      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
    ", 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
    ", 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 }
  • 相关阅读:
    Django中DEBUG模式详解
    Nginx 的负载均衡
    django 上线配置
    vue 项目实现打印
    vue 一键复制,vue-clipboard2的使用方法
    404.vue
    vue-router封装和用户是否需要登录
    uni-app uview 的使用方法
    grid自适应列表
    tomcat的目录分别代表什么含义
  • 原文地址:https://www.cnblogs.com/ht-beyond/p/4562027.html
Copyright © 2011-2022 走看看