zoukankan      html  css  js  c++  java
  • HDOJ_ACM_Ahui Writes Word

    Problem Description
    We all know that English is very important, so Ahui strive for this in order to learn more English words. To know that word has its value and complexity of writing (the length of each word does not exceed 10 by only lowercase letters), Ahui wrote the complexity of the total is less than or equal to C.
    Question: the maximum value Ahui can get.
    Note: input words will not be the same.
     
    Input
    The first line of each test case are two integer N , C, representing the number of Ahui’s words and the total complexity of written words. (1 ≤ N ≤ 100000, 1 ≤ C ≤ 10000)
    Each of the next N line are a string and two integer, representing the word, the value(Vi ) and the complexity(Ci ). (0 ≤ Vi , Ci ≤ 10)
     
    Output
    Output the maximum value in a single line for each test case.
     
    Sample Input
    5 20
    go 5 8
    think 3 7
    big 7 4
    read 2 6
    write 3 5
     
    Sample Output
    15
    Hint
    Input data is huge,please use “scanf(“%s”,s)”
     
    Code
    Time limit exceeded
    View Code
     1 #include <stdio.h>
     2 #define C 10000
     3 #define N 100000
     4 int f[C + 5];
     5 int value[N + 5];
     6 int complexity[N + 5];
     7 int main()
     8 {
     9     int i, j, n, c, count;
    10     char str[15];
    11     while (scanf("%d %d", &n, &c) != EOF)
    12     {
    13         for (i = 1; i <= n; i++)
    14         {
    15             scanf("%s", str);
    16             scanf("%d %d", &value[i], &complexity[i]);
    17         }
    18         for (i = 1; i <= c; i++)
    19             f[i] = 0;
    20         for (i = 1, count = 1; i <= n; i++)
    21         {
    22             if (complexity[i] == 0)
    23             {
    24                 f[0] += value[i];
    25             }
    26             else
    27             {
    28                 complexity[count] = complexity[i];
    29                 value[count] = value[i];
    30                 count++;
    31             }
    32         }
    33         for (i = 1; i <= count; i++)
    34         {
    35             for (j = c; j >= complexity[i]; j--)
    36                 if (f[j] < f[j - complexity[i]] + value[i])
    37                     f[j]  = f[j - complexity[i]] + value[i];
    38         }
    39         printf("%d\n", f[c]);
    40     }
    41     return 0;
    42 }

    Accepted

    View Code
     
    Key Points
    This question is easy, if you just want get the answer. But the time will be exceeded, so you must improve the algrithm.
    You will note that the vi and ci is really small, so you will find there are a lot of words whose value and complexity is the same.
    So, you can translate it. using the array words[15][15] can receive all the arise number.
    If you realize this, the follow question is the same to the before blog's question.
     
    要点
    咋看这个问题,很简单。 但是你会发现你的代码会超时,那么你需要改进算法,你会注意到vi和ci很小,所以有很多单词的value和complexity的值是相同的,所以你得到了转换的方法,用一个words[15][15]的数组就可以接收单词出现的次数。如果你已经想到这里了,那么接下来的问题就跟我上一篇博客的问题是一样的了。
     
    Pay Attention
    you must using while (scanf() != EOF)
    you should write down on the paper firstly, then code on the comput.
    it may spend 1000MS to circulate 200,000,000 times.
  • 相关阅读:
    poj3292
    poj2635
    Android学习之——自己搭建Http框架(2)——框架扩展
    swift -函数、函数指针
    算法导论 第二十一章:不相交集合森林
    Java推断类和实例的关系
    深搜解Riding the Fences
    mariadb克隆
    java-集合类(二)
    在GitHub上使用Hexo搭建静态博客
  • 原文地址:https://www.cnblogs.com/chuanlong/p/2804080.html
Copyright © 2011-2022 走看看