zoukankan      html  css  js  c++  java
  • hdu 2616 Kill the monster(stl全排列+暴力)

    Kill the monster

    Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
    Total Submission(s): 502    Accepted Submission(s): 345


    Problem Description
    There is a mountain near yifenfei’s hometown. On the mountain lived a big monster. As a hero in hometown, yifenfei wants to kill it.
    Now we know yifenfei have n spells, and the monster have m HP, when HP <= 0 meaning monster be killed. Yifenfei’s spells have different effect if used in different time. now tell you each spells’s effects , expressed (A ,M). A show the spell can cost A HP to monster in the common time. M show that when the monster’s HP <= M, using this spell can get double effect.
     
    Input
    The input contains multiple test cases.
    Each test case include, first two integers n, m (2<n<10, 1<m<10^7), express how many spells yifenfei has.
    Next n line , each line express one spell. (Ai, Mi).(0<Ai,Mi<=m).
     
    Output
    For each test case output one integer that how many spells yifenfei should use at least. If yifenfei can not kill the monster output -1.
     
    Sample Input
     3 100
    10 20
    45 89
    5 40
     
    3 100
    10 20
    45 90
    5 40
     
    3 100
    10 20
    45 84
    5 40
    Sample Output
    3 2 -1
    分析:
    (1)因为数据比较少,每一组最多有是个数据,可以用全排列暴力计算找出最小的组合
    (2)这里借助于stl算法库中的next_permutation()全排列算法。暴力把所有的排列方法计算一遍。然后找出最小的组合方法。
    #include <iostream>
    #include <stdio.h>
    #include <algorithm>
    using namespace std;
    int main()
    {
        int o[10],a[10],m[10];
        int n,M,count,min;
    
        while(cin>>n>>M)
        {
            for(int i=0;i<n;i++)
            cin>>a[i]>>m[i];
            for(int i=0;i<n;i++)
            o[i] = i;
            min = 100;
            do{
                count = 0;
                int tem = M;
                for(int i=0;i<n;i++)
                {
                    count++;
                    if(tem<=m[o[i]])
                    tem -= a[o[i]]*2;
                    else tem -= a[o[i]];
                    if(tem<=0)
                    {
                        if(count<min)
                        min = count;
                        break;
                    }
                }
            }while(next_permutation(o,o+n));
            if(min==100)printf("-1\n");
            else printf("%d\n",min);
        }
    
        return 0;
    }
  • 相关阅读:
    MySQL5.7 容器化安装
    什么是架构?——软件系统架构的定义
    服务端高并发分布式架构演进之路(转)
    CentOS7 增加回环地址
    三句话看明白jdk收费吗
    【转载】C#里怎么把string类型转换成double
    【转载】如何查看自己网站的搜索引擎收录量和索引量
    【转载】c# datatable 判断值是否存在
    【转载】C#中Datatable修改列名
    【转载】C#使用typeof运算符获取对象变量的具体类型Type
  • 原文地址:https://www.cnblogs.com/newpanderking/p/2713240.html
Copyright © 2011-2022 走看看