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.
  • 相关阅读:
    js中的replace替换全部
    Oracle中创建数据链
    Hbuildx+vue+axios+element ui初学部署
    html5抠图
    Oracle误删除数据的恢复方法
    vs 生成项目自动关闭当前运行程序
    Mvc项目在iis上面显示文件夹 输入地址页面也打不开
    FastReport快速打印(.net)
    脚本之家
    VS自定义作者、创建时间
  • 原文地址:https://www.cnblogs.com/chuanlong/p/2804080.html
Copyright © 2011-2022 走看看