题解 | #代理服务器#

代理服务器

http://www.nowcoder.com/practice/1284469ee94a4762848816a42281a9e0

简单贪心算法

#include <iostream>
#include <string>
#include <vector>

using namespace std;

int main()
{
    int n, m;
    while (cin >> n) {
        vector<string> proxy;
        string s;
        while (n--) {
            cin >> s;
            proxy.push_back(s);
        }
        cin >> m;
        vector<string> ip;
        while (m--) {
            cin >> s;
            ip.push_back(s);
        }
        if (proxy.size() == 1) {    //处理代理服务器只有1个的情况
            int flag = false;
            for (int i = 0; i < ip.size(); i++) {
                if (ip[i] == proxy[0]) {
                    flag = true;
                    break;
                }
            }
            if (flag) {
                cout << "-1" << endl;
            }
            else {
                cout << "0" << endl;
            }
            continue;
        }
        int begin = 0, cnt = 0, pos = 0;
        int i, j;
        while (begin != ip.size()) {    //每次从所有代理服务器中选择一个可以到达最远的ip的位置
            for (i = 0; i < proxy.size(); i++) {
                for (j = begin; j < ip.size(); j++) {
                    if (proxy[i] == ip[j]) {
                        break;
                    }
                }
                pos = max(pos, j);   //可以到达最远的ip的position
            }
            begin = pos;  //下一次开始的位置从position处开始
            cnt++;    //这个位置处需要切换代理服务器了
        }
        cout << cnt - 1 << endl;
    }
    return 0;
}
全部评论

相关推荐

思念SiN:你这里没有通过的主要原因应该是计算平均分数的时候,在你贴的代码的第23行: ```c b[i]=(sum-max-min)/(m-2); ``` 等式的右边实际上是两个`int`类型的变量在做除法,C语言里面得到的结果会是这个除法的整数部分,余数部分被舍弃了,也不会自动变成浮点数去做除法。所以虽然你使用了`b[i]`这个浮点数去接收结果,但是等式右边除法是先得到了一个整数,然后再被转换为浮点数再赋值给了`b[i]`。你可以按下面这样,在做除法之前,先进行类型转换,就能得到期望的结果: ```c b[i]=(float)(sum-max-min)/(float)(m-2); ```
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务