- 题目很容易看懂。。但是一开始一直想不到怎么解决,后来看了讨论区@愣头青丶别处仰望 大佬的代码,大概懂了本题贪心的策略,思考了半天,想了个不怎么严谨的证明。。
- 算法思路是按照访问服务器的顺序,找到最远的那个和代理服务器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;
}
京公网安备 11010502036488号