代理服务器

代理服务器

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

  1. 题目很容易看懂。。但是一开始一直想不到怎么解决,后来看了讨论区@愣头青丶别处仰望 大佬的代码,大概懂了本题贪心的策略,思考了半天,想了个不怎么严谨的证明。。
  2. 算法思路是按照访问服务器的顺序,找到最远的那个和代理服务器ip相同的服务器,让计数器++。
  3. (假设有两个代理服务器1和2),按照算法的规则,前面一部分的访问顺序必然是 ......1(......中至少有一个2且无1),这一部分选择的是1号代理服务器。反证法:如果说选择2号能使得切换次数更少,那么在这一部分的中途由于遇到了2号服务器,那么要至少多切换一次,这样与切换次数最少就矛盾了,所以说在局部的子服务器序列中,先用最远的代理服务器来访问就能保证整体的切换次数更少

ps:希望有大佬能用更严谨的语言或者公式启发一下我,实在是没想到比较好的证明方法。。

#include <stdio.h>
#include <string.h>

int main()
{
    char proxy[1000][18], server[5000][18];
    int n,m;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i = 0; i < n; i++)
            scanf("%s", proxy[i]);
        scanf("%d", &m);
        for(int i = 0; i < m; i++)
            scanf("%s", server[i]);

        int index = 0, flag = 1, count = -1, j;
        while(flag && index != m)
        {
            int max = 0;
            for(int i = 0; i < n; i++)
            {
                j = index;
                while(strcmp(proxy[i], server[j]) && j < m)
                    j++;
                if(j - index > max)
                    max = j - index;
            }
            if(!max)
                flag = 0;
            count++;
            index += max;
        }

        if(flag)
            printf("%d\n", count);
        else
            printf("-1\n");
    }

    return 0;
}
全部评论

相关推荐

11-03 14:38
重庆大学 Java
AAA求offer教程:我手都抬起来了又揣裤兜了
点赞 评论 收藏
分享
点赞 收藏 评论
分享
牛客网
牛客企业服务