OJ 之 FATE

- FATE

Crawling in process... Crawling failed Time Limit:1000MS     Memory Limit:32768KB     64bit IO Format:%I64d & %I64u

Submit Status Practice HDU 2159

Description

最近xhd正在玩一款叫做FATE的游戏,为了得到极品装备,xhd在不停的杀怪做任务。久而久之xhd开始对杀怪产生的厌恶感,但又不得不通过杀怪来升完这最后一级。现在的问题是,xhd升掉最后一级还需n的经验值,xhd还留有m的忍耐度,每杀一个怪xhd会得到相应的经验,并减掉相应的忍耐度。当忍耐度降到0或者0以下时,xhd就不会玩这游戏。xhd还说了他最多只杀s只怪。请问他能升掉这最后一级吗?

Input

输入数据有多组,对于每组数据第一行输入n,m,k,s(0 < n,m,k,s < 100)四个正整数。分别表示还需的经验值,保留的忍耐度,怪的种数和最多的杀怪数。接下来输入k行数据。每行数据输入两个正整数a,b(0 < a,b < 20);分别表示杀掉一只这种怪xhd会得到的经验值和会减掉的忍耐度。(每种怪都有无数个)

Output

输出升完这级还能保留的最大忍耐度,如果无法升完这级输出-1。

Sample Input

10 10 1 10 1 1 10 10 1 9 1 1 9 10 2 10 1 1 2 2

Sample Output

0 -1 1

#include<stdio.h>
#include<string.h>

struct hello
{
    int x;
    int y;
}yi[500];  //存放花费和获得经验

int ok[500][500]={ 0 };

int main()
{
    int a,b,c,n,m,k,v1,v2;

    while(~scanf("%d %d %d %d",&n,&v1,&k,&v2))
    {
        memset(ok,0,sizeof(ok));

        for(a=0; a<k; a++)
        {
            scanf("%d %d",&yi[a].y,  &yi[a].x ); //读入 杀怪的获得经验 和 花费的忍耐度
        }
        for(a=0; a<k; a++)  //循环怪的种类
        {
            for(b=yi[a].x; b<=v1;  b++)// 循环杀怪的忍耐度
            {
                for(c=1; c<=v2; c++) //允许杀怪的个数
                {
                    if(ok[b][c] < ok[b-yi[a].x][c-1]+yi[a].y)  //ok[b][c]代表忍耐度为b,杀怪数为c,所获得的最大经验。
                    {
                         ok[b][c]  =  ok[b-yi[a].x][c-1]+yi[a].y;
                    }
                }
            }
        }
        int loop=0,sum;
        for(a=0;a<=v1;a++)  //v1 是忍耐度 v2是最大可杀怪的数目
        {
            for(b=1;b<=v2;b++)
            {
                if(ok[a][b]>=n)
                    {loop=1;sum=a;break;}
            }
            if(loop) break;
        }
        if(loop)
            printf("%d\n",v1-sum);
        else
            printf("-1\n");
    }
    return 0;
}

#include <stdio.h>
#include <string.h>

int f[150][150] ;
int w[150];  //获得经验
int c[150];  //花费的忍耐度

int main()
{
    int n, m, kk, s;
    int i, j, k;
    int flag, cc;

    while(scanf("%d %d %d %d", &n, &m, &kk, &s )!=EOF) //读入n所需经验  m忍耐度  kk怪的种类  s可杀得最大怪的数目
    {
        flag= 0;
        memset(f, 0, sizeof(f ));
        for(i=0; i<kk; i++)
        {
            scanf("%d %d", &w[i], &c[i] );
        }

        for(i=0; i<kk; i++)
        {
            for(j=c[i]; j<=m; j++)
            {
                for(k=1; k<=s; k++)
                {
                    if(f[j][k] < (f[j-c[i]][k-1] + w[i]) )
                    {
                        f[j][k] = f[j-c[i]][k-1] + w[i] ;
                    }
                }
            }
        }

        for(i=0; i<=m; i++)
        {
            for(j=1; j<=s; j++)
            {
                if( f[i][j] >=n )
                {
                    flag=1;
                    cc = i;
                    break;
                }
            }
            if(flag==1)
                break;
        }
        if(flag)
            printf("%d\n", m-cc );
        else
            printf("-1\n");
    }
    return 0;
}

OJ 之 FATE,布布扣,bubuko.com

时间: 2024-10-14 14:11:12

OJ 之 FATE的相关文章

HDU OJ 2159 FATE

#include <stdio.h> #include <string.h> int f[150][150] ; int w[150]; //»ñµÃ¾­Ñé int c[150]; //»¨·ÑµÄÈÌÄÍ¶È int main() { int n, m, kk, s; int i, j, k; int flag, cc; while(scanf("%d %d %d %d", &n, &m, &kk, &s )!=EOF) //

LeetCode OJ - Sum Root to Leaf Numbers

这道题也很简单,只要把二叉树按照宽度优先的策略遍历一遍,就可以解决问题,采用递归方法越是简单. 下面是AC代码: 1 /** 2 * Sum Root to Leaf Numbers 3 * 采用递归的方法,宽度遍历 4 */ 5 int result=0; 6 public int sumNumbers(TreeNode root){ 7 8 bFSearch(root,0); 9 return result; 10 } 11 private void bFSearch(TreeNode ro

LeetCode OJ - Longest Consecutive Sequence

这道题中要求时间复杂度为O(n),首先我们可以知道的是,如果先对数组排序再计算其最长连续序列的时间复杂度是O(nlogn),所以不能用排序的方法.我一开始想是不是应该用动态规划来解,发现其并不符合动态规划的特征.最后采用类似于LRU_Cache中出现的数据结构(集快速查询和顺序遍历两大优点于一身)来解决问题.具体来说其数据结构是HashMap<Integer,LNode>,key是数组中的元素,所有连续的元素可以通过LNode的next指针相连起来. 总体思路是,顺序遍历输入的数组元素,对每个

LeetCode OJ - Surrounded Regions

我觉得这道题和传统的用动规或者贪心等算法的题目不同.按照题目的意思,就是将被'X'围绕的'O'区域找出来,然后覆盖成'X'. 那问题就变成两个子问题: 1. 找到'O'区域,可能有多个区域,每个区域'O'都是相连的: 2. 判断'O'区域是否是被'X'包围. 我采用树的宽度遍历的方法,找到每一个'O'区域,并为每个区域设置一个value值,为0或者1,1表示是被'X'包围,0则表示不是.是否被'X'包围就是看'O'区域的边界是否是在2D数组的边界上. 下面是具体的AC代码: class Boar

light oj 1236 【大数分解】

给定一个大数,分解质因数,每个质因子的个数为e1,e2,e3,--em, 则结果为((1+2*e1)*(1+2*e2)--(1+2*em)+1)/2. //light oj 1236 大数分解素因子 #include <stdio.h> #include <iostream> #include <string.h> #include <algorithm> #include <math.h> #include <ctype.h> #i

【华为OJ】201301 JAVA 题目0-1级 将数组分为相等的两组

描述:  编写一个函数,传入一个int型数组,返回该数组能否分成两组,使得两组中各元素加起来的和相等,并且,所有5的倍数必须在其中一个组中,所有3的倍数在另一个组中(不包括5的倍数),能满足以上条件,返回true:不满足时返回false. 知识点: 语言基础,字符串,循环,函数,指针,枚举,位运算,结构体,联合体,文件操作,递归    题目来源: 内部整理  练习阶段: 初级  运行时间限制: 10Sec 内存限制: 128MByte 输入: 输入输入的数据个数 输入一个int型数组 输出: 返

LeetCode OJ - Subsets 1 &amp;&amp; 2

这道题的做法,一定得掌握啊!!!  elegant & beautiful & concise 下面是AC代码: 1 /** 2 * Given a set of distinct integers, S, return all possible subsets. 3 * 这道题的做法应该要记住!!!!! 4 * @param s 5 * @return 6 */ 7 public ArrayList<ArrayList<Integer>> subsets(int[

LeetCode OJ - Convert Sorted Array/List to Binary Search Tree

虚函数使用的时机 为什么虚函数不总是适用? 1. 虚函数有事会带来很大的消耗: 2. 虚函数不总是提供所需的行为: 3. 当我们不考虑继承当前类时,不必使用虚函数. 必须使用虚函数的情况: 1. 当你想删除一个表面上指向基类对象,实际却是指向派生类对象的指针,就需要虚析构函数. LeetCode OJ - Convert Sorted Array/List to Binary Search Tree,布布扣,bubuko.com LeetCode OJ - Convert Sorted Arra

【南阳OJ分类之语言入门】80题题目+AC代码汇总

声明: 题目部分皆为南阳OJ题目. 代码部分包含AC代码(可能不止一个)和最优代码,大部分都是本人写的,并且大部分为c代码和少部分c++代码and极少java代码,但基本都是c语言知识点,没有太多差别,可能代码有的写的比较丑,毕竟知识有限. 语言入门部分题基本都较为简单,是学习编程入门的很好练习,也是ACM的第一步,入门的最佳方法,望认真对待. 本文由csdn-jtahstu原创,转载请注明出处,欢迎志同道合的朋友一起交流学习.本人QQ:1373758426和csdn博客地址. now begi