• UVA 506 System Dependencies(模拟 烂题)


    https://vjudge.net/problem/UVA-506

      题目是给出了五种指令,DEPEND、INSTALL、REMOVE、LIST、END,操作的格式及功能如下:

     

    DEPEND item1 item2 (item3 ...) 安装item1需要先安装item2(、item3……)
    INSTALL item1 安装item1,如果item1依赖其他组件,则先安装其依赖的其他组件
    REMOVE item1 移除item1及其依赖的全部组件,如果组件被其他程序依赖,则不移除
    LIST 输出当前已安装的所有组件
    END 结束程序



      INSTALL指令中作为参数的组件的安装是显式安装,其所依赖的组件的安装不是显示安装。被显式安装的组件只能通过REMOVE指令显式删除,而移除中的组件如果当前被其他显式安装的组件直接或间接地依赖,则不能通过REMOVE移除。

      每当输入指令之后,先原样输出一遍指令,然后执行指令。安装组件时如果可以安装组件则需输出“Installing 组建名”。如果显式安装时组件已被安装则提示“组建名 is already installed.”,隐式安装则无需提示。如果显式删除组件时组件未被安装则提示“组建名 is not installed.”,如果组件被其他组件依赖则提示“组建名 is still needed.”,隐式卸载则无需提示。

      其实就是个用STL做的复杂模拟,纯属吃力不讨好的题目,并学不到什么算法思想,唯一的亮点就是为一个组件建立依赖和被依赖两个列表,其他的操作模拟即可。

     1 #include <iostream>
     2 #include <algorithm>
     3 #include <string>
     4 #include <sstream>
     5 #include <set>
     6 #include <vector>
     7 #include <stack>
     8 #include <map>
     9 #include <queue>
    10 #include <deque>
    11 #include <cstdlib>
    12 #include <cstdio>
    13 #include <cstring>
    14 #include <cmath>
    15 #include <ctime>
    16 #include <functional>
    17 using namespace std;
    18 
    19 int cnt = 0, status[maxn];  
    20 vector<int> depend[maxn], depend2[maxn];  
    21 vector<int> installed;  
    22 string name[maxn];  
    23   
    24 int get_id(const string & x)  
    25 {  
    26     for (int i = 0; i < cnt; i++)  
    27         if (name[i] == x)  
    28             return i;  
    29     name[cnt++] = x;  
    30     return cnt-1;  
    31 }  
    32   
    33 void instal(int item, bool top)  
    34 {  
    35     if (!status[item]){  
    36         for (size_t i = 0; i < depend[item].size(); i++)  
    37             instal(depend[item][i], false);  
    38         cout << "   Installing " << name[item] << endl;  
    39         status[item] = top ? 1 : 2;  
    40         installed.push_back(item);  
    41     }  
    42     else if(top)  
    43         cout << "   " << name[item] << " is already installed." << endl;  
    44 }  
    45   
    46 bool needed(int item)  
    47 {  
    48     for (size_t i = 0; i < depend2[item].size(); i++)  
    49         if (status[depend2[item][i]])  
    50             return true;  
    51     return false;  
    52 }  
    53   
    54 void Remove(int item, bool top)  
    55 {  
    56     if(top && status[item]==0)  
    57         cout << "   " << name[item] << " is not installed." << endl;  
    58     else if(top && needed(item))  
    59         cout << "   " << name[item] << " is still needed." << endl;  
    60     else if ((top || status[item] == 2) && !needed(item)){  
    61         status[item] = 0;  
    62         installed.erase(remove(installed.begin(), installed.end(), item), installed.end());  
    63         cout << "   Removing " << name[item] << endl;  
    64         for (size_t i = 0; i < depend[item].size(); i++)  
    65             Remove(depend[item][i], false);  
    66     }  
    67 }  
    68   
    69 int main()  
    70 {  
    72     ios::sync_with_stdio(false);  
    73     string line;  
    74     while (getline(cin, line), line != "END")  
    75     {  
    76         cout << line << endl;  
    77         stringstream ss(line);  
    78         if (line[0] == 'L'){  
    79             for (size_t i = 0; i != installed.size(); ++i)  
    80                 cout << "   " << name[installed[i]] << endl;  
    81         }  
    82         else{  
    83             string t1, t2, t3;  
    84             ss >> t1 >> t2;  
    85             if (t1[0] == 'D'){  
    86                 while (ss >> t3){  
    87                     depend[get_id(t2)].push_back(get_id(t3));  
    88                     depend2[get_id(t3)].push_back(get_id(t2));  
    89                 }  
    90             }  
    91             else if (t1[0] == 'I')  
    92                 instal(get_id(t2), true);  
    93             else if (t1[0] == 'R')  
    94                 Remove(get_id(t2), true);  
    95         }  
    96     }  
    97     cout << "END" << endl;  
    98     return 0;  
    99 }  
  • 相关阅读:
    分别给Python类和实例增加属性和方法
    什么是tcp, udp 以及它们的区别
    输入www.baidu.com后的过程详解
    tcp 三次握手,四次挥手
    python sort 排序的使用
    mysql数据脏读、幻读、不可重复读
    python 之集合的删除
    CompletableFuture保证线程同步
    多线程动态传参问题
    git冲突的解决与版本回退遇到的问题
  • 原文地址:https://www.cnblogs.com/YingZhixin/p/7512930.html
Copyright © 2020-2023  润新知