题解 | #代理服务器#

代理服务器

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

#include <cstdio>
#include <iostream>
#include <string>
#include <map>

using namespace std;

//“每一步走尽量远”的贪心思路是没错的,虚心学习他人做法,汲取那个“标记”的思路。
//每次切走时有一个关键细节,详见该处注释 

map<string, bool> agent;

int main(){
	int n,m;
	while(scanf("%d",&n) != EOF){
		string s;
		for(int i=0; i<n; i++){
			cin >> s;
			agent.insert(pair<string, bool>(s, false));
		}
		int cnt = 0;//当前agent中已被标记的个数 
		int ans = 0;//切换次数 
		scanf("%d",&m);
		int bk = 0;//里层break标识 
		for(int i=0; i<m; i++){
			cin >> s;
			if(agent.count(s)){//有对应的代理
				if(n == 1){//无解情况的处理 
					printf("-1\n");
					bk = 1;
					i++;
					while(i<m){
						cin>>s; i++;
					}
					break;
				}
				if(agent[s] == false){//没标记过则标记 
					cnt++;
					agent[s] =  true;
				}
			}
			if(cnt == n){//已全都标记过,则执行切换 切换的目标待定 (刚才这一轮应该用哪个来扫,也是此时才确定的) 
						//注意一个关键细节:由于是“切走”,所以切之前的那个直接置为true 
				cnt = 1;
				ans++;
				for(map<string,bool>::iterator iter = agent.begin(); iter!=agent.end(); iter++){//学习使用迭代器 
					if(iter->first != s){
						iter->second = false;//全部重置为未标记状态 
					}
				}
			}
		}
		if(bk){
			continue;
			agent.clear();
		}
		printf("%d\n",ans);
		agent.clear();
	}
	return 0;
}
全部评论

相关推荐

不愿透露姓名的神秘牛友
11-26 15:46
已编辑
字节国际 电商后端 24k-35k
点赞 评论 收藏
分享
贪食滴🐶:你说熟悉扣篮的底层原理,有过隔扣职业球员的实战经验吗
点赞 评论 收藏
分享
感性的干饭人在线蹲牛友:🐮 应该是在嘉定这边叭,禾赛大楼挺好看的
点赞 评论 收藏
分享
评论
点赞
收藏
分享
牛客网
牛客企业服务