代理服务器
代理服务器
http://www.nowcoder.com/questionTerminal/1284469ee94a4762848816a42281a9e0
- 题目很容易看懂。。但是一开始一直想不到怎么解决,后来看了讨论区@愣头青丶别处仰望 大佬的代码,大概懂了本题贪心的策略,思考了半天,想了个不怎么严谨的证明。。
- 算法思路是按照访问服务器的顺序,找到最远的那个和代理服务器ip相同的服务器,让计数器++。
- (假设有两个代理服务器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; }