题解 | #代理服务器#
代理服务器
http://www.nowcoder.com/practice/1284469ee94a4762848816a42281a9e0
第一次尝试时错误地将题目理解成了求解需要切换多少次(忽略了次序要求)
之后更改思路,想到应该选择能跑最远的agent,但机械地选择了在整体区间上进行。
学习评论区@愣头青丶别处仰望 大佬的代码后改正了想法。即利用所有agent来划分区间,选择能跑最远的那个,之后再重新选择(这才是贪心的思想所在)。如果跑不动了,则说明没有符合要求的安排方式。
#include <cstdio>
#include <cstring>
using namespace std;
char agents[1002][16];
char dest[5002][16];
bool vis[5002];
int main(void){
int n, m;
while(scanf("%d", &n) != EOF){
for(int i=0; i<n; i++){
scanf("%s", agents[i]);
}
scanf("%d", &m);
for(int i=0; i<m; i++){
scanf("%s", dest[i]);
vis[i] = false;
}
int maxn=0, cnt = 0, idx = 0, flag = 1;
while(flag && idx < m){
maxn = 0;
for(int i = 0; i<n; i++){
int k = idx;
while(k<m && strcmp(agents[i], dest[k]) != 0)
k++;
if(k - idx > maxn)
maxn = k - idx;
}
if(maxn == 0)
flag = 0;
cnt++;
idx += maxn;
}
if(flag)
printf("%d\n", cnt - 1);
else
printf("-1\n");
}
return 0;
}