zoukankan      html  css  js  c++  java
  • uva-10602-贪心

    题意:有个编辑器,支持三种操作,摁下一个键盘上的字符,重复最后一个单词,删除最后一个字符.给N个字符串,必须先在编辑器内输入第一个字符,

    问,输入完所有字符串最少需要摁下多少次键盘.

    最多100个字符串,每个字符串长度最多为100.

    可以观察到,为了使摁下键盘的次数最少,必须尽可能的利用当前输入的最后一个字符串.考虑到俩个操作,重复最后一个字符串,删除最后一个字符,那么,只要前缀是匹配的,就可以通过这

    俩个操作来减少摁下键盘的次数.所以每次都找前缀匹配最大的字符串即可.

    老罗一定做过这个题,而且抄袭了这个创意,用语音控制输入.

     
    #include <string>
    #include<iostream>
    #include<map>
    #include<memory.h>
    #include<vector>
    #include<algorithm>
    #include<queue>
    #include<vector>
    #include<stack>
    #include<math.h>
    #include<iomanip>
    #include<bitset>
    #include"math.h"
    namespace cc
    {
        using std::cout;
        using std::endl;
        using std::cin;
        using std::map;
        using std::vector;
        using std::string;
        using std::sort;
        using std::priority_queue;
        using std::greater;
        using std::vector;
        using std::swap;
        using std::stack;
        using std::bitset;
    
    
    
        constexpr int N = 110;
    
        int cases;
        char strs[N][N];
        char cur[N];
        
        int total = 0;
        int n;
    
        void solve()
        {
            cin >> cases;
            while (cases--) 
            {
                cin >> n;
                total = 0;
                memset(strs,0,sizeof(strs));
                for (int i=0;i<n;i++) 
                {
                    scanf("%s",strs[i]);
                }
                total += strlen(strs[0]);
                memcpy(cur,strs[0],sizeof(strs[0]));
                int vis[N] = {0};
                int seqs[N] = {0};
                int seq = 0;
                seqs[seq++] = 0;
                vis[0] = 1;
                while (true) 
                {
                    int nextIndex = -1;
                    int min = -1;
                    int curL = strlen(cur);
                    for (int i=0;i<n;i++) 
                    {
                        if (vis[i] != 0)
                            continue;
                        int curMin = 0;
                        for (int j=0;j< curL;j++)
                        {
                            if (strs[i][j] == ''|| strs[i][j]!= cur[j])
                                break;
                            ++curMin;
                        }
                        if (min < curMin)
                        {
                            min = curMin;
                            nextIndex = i;
                        }
                    }
                    if (nextIndex == -1)
                        break;
                    vis[nextIndex] = 1;
                    seqs[seq++] = nextIndex;
                    total += strlen(strs[nextIndex])-min;
                    memcpy(cur,strs[nextIndex],N);
                }
                cout << total << endl;
                for (int i = 0;i < n;i++)
                {
                    cout << strs[seqs[i]] << endl;
                }
                
                
            }
        }
    
    };
    
    
    int main()
    {
    
    #ifndef ONLINE_JUDGE
        freopen("d://1.text", "r", stdin);
    #endif // !ONLINE_JUDGE
        cc::solve();
    
        return 0;
    }
  • 相关阅读:
    Jmeter之参数化
    JMETER之一般使用和断言(响应断言和JSON断言)
    JMETER之工具设置和可执行元件介绍
    fiddler 之简单并发、弱网设置
    fiddler之断点、篡改和伪造数据
    fiddler之手机端连接
    fiddler之工具介绍
    fiddler之图标描述
    原生js添加和删除类名
    抽象类和接口
  • 原文地址:https://www.cnblogs.com/shuiyonglewodezzzzz/p/10292278.html
Copyright © 2011-2022 走看看