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.
  • 相关阅读:
    【实验】利用系统自带脚本utlsampl.sql创建scott用户及样本数据
    有哪些优秀的沟通思路?
    srand()以及rand()函数用法
    微信公众号
    Sublime Text 3 全程详细图文原创教程(持续更新中。。。)
    Android应用的缓冲界面启动界面
    ListView技巧
    android线性布局参数
    CocoaPods的一波三则
    003.开发者账号异同
  • 原文地址:https://www.cnblogs.com/chuanlong/p/2804080.html
Copyright © 2011-2022 走看看