时间限制:1 秒

内存限制:32 兆

特殊判题:否

提交:1871

解决:574

题目描述:

使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私。我们知道n个代理服务器的IP地址,现在要用它们去访问m个服务器。这 m 个服务器的 IP 地址和访问顺序也已经给出。系统在同一时刻只能使用一个代理服务器,并要求不能用代理服务器去访问和它 IP地址相同的服务器(不然客户端信息很有可能就会被泄露)。在这样的条件下,找到一种使用代理服务器的方案,使得代理服务器切换的次数尽可能得少。

输入:

每个测试数据包括 n + m + 2 行。

    第 1 行只包含一个整数 n,表示代理服务器的个数。

    第 2行至第n + 1行每行是一个字符串,表示代理服务器的 IP地址。这n个 IP地址两两不相同。

    第 n + 2 行只包含一个整数 m,表示要访问的服务器的个数。

    第 n + 3 行至第 n + m + 2 行每行是一个字符串,表示要访问的服务器的 IP 地址,按照访问的顺序给出。

    每个字符串都是合法的IP地址,形式为“xxx.yyy.zzz.www”,其中任何一部分均是0–255之间的整数。输入数据的任何一行都不包含空格字符。

其中,1<=n<=1000,1<=m<=5000。

输出:

可能有多组测试数据,对于每组输入数据, 输出数据只有一行,包含一个整数s,表示按照要求访问服务器的过程中切换代理服务器的最少次数。第一次使用的代理服务器不计入切换次数中。若没有符合要求的安排方式,则输出-1。

样例输入:
3
166.111.4.100
162.105.131.113
202.112.128.69
6
72.14.235.104
166.111.4.100
207.46.19.190
202.112.128.69
162.105.131.113
118.214.226.52
样例输出:
1
来源:
2009年清华大学计算机研究生机试真题

思路:

贪心算法,类似OS里的最优进程调度。找到后继第一次出现位置最远的代理IP,选择这个IP作为当前代理。

用一个数组来存储当前所有选择。

注意这个题的各种特殊情况,我WA了很多次才AC的。

代码:

#include <stdio.h>
#include <string.h>
#include <stdlib.h> #define LEN 20
#define N 1000
#define M 5000 int flag[N];
int flagCount = 0; void initFlag(int n)
{
for (int i=0; i<n; i++)
flag[i] = 0;
flagCount = 0;
} void setFlag(int i)
{
if (flag[i] == 0)
{
flag[i] = 1;
flagCount ++;
}
} int cmp(const void *a, const void *b)
{
return strcmp((char *)a, (char *)b);
} int main(void)
{
int n, m, i;
char sn[N][LEN], sm[M][LEN];
char *p;
int changeCount; while (scanf("%d", &n) != EOF)
{
for (i=0; i<n; i++)
scanf("%s", sn[i]);
qsort(sn, n, sizeof(sn[0]), cmp); scanf("%d", &m);
changeCount = 0;
initFlag(n);
for (i=0; i<m; i++)
scanf("%s", sm[i]);
for (i=0; i<m; i++)
{
if (flagCount == n)
{
changeCount = -1;
break;
}
p = (char *)bsearch(sm[i], sn, n, sizeof(sn[0]), cmp);
if (p == NULL)
continue;
int index = (p-(char *)sn)/LEN;
if (flag[index] == 0)
{
setFlag(index);
if (flagCount == n)
{
changeCount ++;
initFlag(n);
setFlag(index);
}
}
}
printf("%d\n", changeCount);
} return 0;
}
/**************************************************************
Problem: 1082
User: liangrx06
Language: C
Result: Accepted
Time:10 ms
Memory:964 kb
****************************************************************/

别人的另一份C++ 的代码:

#include <iostream>
#include <vector>
#include <string>
#include <algorithm>
using namespace std; int n,m;
vector<string> a,b; int main(int argc,char* argv[]){
//freopen("input.txt","r",stdin);
string s;
int n;
while(cin>>n){
a.resize(0);
b.resize(0);
while(n--){
cin>>s;
a.push_back(s);
}
cin>>m;
while(m--){
cin>>s;
b.push_back(s);
}
if(a.size()==1&&find(b.begin(),b.end(),a[0])!=b.end()){
cout<<"-1"<<endl;
continue;
}
n = 0;
vector<string>::iterator max = b.begin();
vector<string>::iterator p;
bool flag = true;
while(flag){
flag = false;
max = b.begin();
for(int i=0;i<a.size();i++){
p = find(b.begin(),b.end(),a[i]);
if(max<p){
max = p;
}
if(p!=b.end()){
flag = true;
}
}
if(max!=b.end()){
n++;
}
b.erase(b.begin(),max);
}
cout<<n<<endl;
}
return 0;
}

九度OJ 1082:代理服务器 (DP)的更多相关文章

  1. 九度OJ 1082 代理服务器 -- 贪心算法

    题目地址:http://ac.jobdu.com/problem.php?pid=1082 题目描述: 使用代理服务器能够在一定程度上隐藏客户端信息,从而保护用户在互联网上的隐私.我们知道n个代理服务 ...

  2. 九度OJ 1500 出操队形 -- 动态规划(最长上升子序列)

    题目地址:http://ac.jobdu.com/problem.php?pid=1500 题目描述: 在读高中的时候,每天早上学校都要组织全校的师生进行跑步来锻炼身体,每当出操令吹响时,大家就开始往 ...

  3. 九度OJ 1531 货币面值(网易游戏2013年校园招聘笔试题) -- 动态规划

    题目地址:http://ac.jobdu.com/problem.php?pid=1531 题目描述: 小虎是游戏中的一个国王,在他管理的国家中发行了很多不同面额的纸币,用这些纸币进行任意的组合可以在 ...

  4. hdu 1284 关于钱币兑换的一系列问题 九度oj 题目1408:吃豆机器人

    钱币兑换问题 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Sub ...

  5. 【九度OJ】题目1475:IP数据包解析 解题报告

    [九度OJ]题目1475:IP数据包解析 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1475 题目描述: 我们都学习过计算机网络, ...

  6. 【九度OJ】题目1205:N阶楼梯上楼问题 解题报告

    [九度OJ]题目1205:N阶楼梯上楼问题 解题报告 标签(空格分隔): 九度OJ http://ac.jobdu.com/problem.php?pid=1205 题目描述: N阶楼梯上楼问题:一次 ...

  7. 九度oj 题目1087:约数的个数

    题目链接:http://ac.jobdu.com/problem.php?pid=1087 题目描述: 输入n个整数,依次输出每个数的约数的个数 输入: 输入的第一行为N,即数组的个数(N<=1 ...

  8. 九度OJ 1502 最大值最小化(JAVA)

    题目1502:最大值最小化(二分答案) 九度OJ Java import java.util.Scanner; public class Main { public static int max(in ...

  9. 九度OJ,题目1089:数字反转

    题目描述: 12翻一下是21,34翻一下是43,12+34是46,46翻一下是64,现在又任意两个正整数,问他们两个数反转的和是否等于两个数的和的反转. 输入: 第一行一个正整数表示测试数据的个数n. ...

随机推荐

  1. Redis 批量删除Redis的key 正则匹配删除

    del 删除单个key方便 要是删除多个就不是很方便了 这时候可以使用xsrsg来批量删除 1.退出redis 2.匹配CCPAI:开头的所有key*删除 redis-cli -a 密码 -h hos ...

  2. Python--Day2/Day3/Day4(运算符、数据类型及内建函数)

    一.昨日内容回顾 Python种类:CPython(Python).JPython.IronPython.PyPy 编码: Unicode.UTF-8.GBK while循环 if...elif... ...

  3. novell.directory.ldap获取邮箱活动目录

    在windows系统上可以使用下列方法来查找所有的员工邮箱和员工组: StringDictionary ReturnArray = new StringDictionary(); Dictionary ...

  4. 从Android动画到贝塞尔曲线

    基础知识: 动画通过连续播放一系列画面,给视觉造成连续变化的图画.很通俗的一种解释.也很好理解.那么我们先来一个案例看看. 动画案例:百度贴吧小熊奔跑 效果: topic.gif 代码: <?x ...

  5. 写在php设计模式前

    在学校写代码的时候,看过许多代码,跟着学长学过一段时间.找工作的时候由于种种原因,从事于本专业, 最近重拾php,充充电,找个好工作. 以前项目中设计模式用的比较多的也就是单例模式,看书中回顾写过的代 ...

  6. 【GLSL教程】(三)在OpenGL中向shader传递信息 【转】

    http://blog.csdn.net/racehorse/article/details/6634830 引言 一个OpenGL程序可以用多种方式和shader通信.注意这种通信是单向的,因为sh ...

  7. TensorFlow笔记四:从生成和保存模型 -> 调用使用模型

    TensorFlow常用的示例一般都是生成模型和测试模型写在一起,每次更换测试数据都要重新训练,过于麻烦, 以下采用先生成并保存本地模型,然后后续程序调用测试. 示例一:线性回归预测 make.py ...

  8. http Keep-Alive

    1.什么是Keep-Alive模式? 我们知道HTTP协议采用“请求-应答”模式,当使用普通模式,即非KeepAlive模式时,每个请求/应答客户和服务器都要新建一个连接,完成之后立即断开连接(HTT ...

  9. [LeetCode] Decode Ways 解码方法个数、动态规划

    A message containing letters from A-Z is being encoded to numbers using the following mapping: 'A' - ...

  10. Nexus 5刷阿里云OS

    刷机有风险,刷机需慎重! 1. 下载 recovery 的img和 阿里云os. recovery 的img下载: https://kanbox.com/f/V00KA 阿里云OS3.0.3 : 2月 ...