• 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.
  • 相关阅读:
    (考研)散列表和hashcode和hashmap
    java基本数据类型和引用类型
    Java 中的语法糖(7/15整个周六上午总结)
    数据库第一天-数据库索引
    MonoBehaviour生命周期
    Unity基础知识
    SQLite3笔记
    cocos_js写文件
    UGUI_屏幕适配
    KMS算法
  • 原文地址:https://www.cnblogs.com/chuanlong/p/2804080.html
Copyright © 2020-2023  润新知