コンピュータの大学院受験の上で機械の問題-代理サーバー

8501 ワード

タイトルの説明
プロキシサーバを使用すると、クライアント情報をある程度隠すことができ、インターネット上のユーザーのプライバシーを保護できます.n個のプロキシサーバのIPアドレスを知っていますが、m個のサーバにアクセスします.このm個のサーバのIPアドレスとアクセス順序も既に与えられている.システムは、同じ時点で1つのエージェントサーバしか使用できず、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。

出力の説明:
複数のテストデータのグループがある可能性があります.入力データのグループごとに出力データは1行しかありません.整数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
リンク:牛客题目地址
もんだいぶんせき
欲張りアルゴリズム
エージェントの切り替え回数が最も少ない解法を見つけるには、最も優れた解は、最も多くのサーバにアクセスできるエージェントを使用するたびに使用されます.答えが-1の場合、エージェントが1つしかない場合に発生する可能性があることに注意してください.
コード#コード#
#include 
#include 

using namespace std;

char Agent[1001][20];
char Server[5001][20];

int main()
{
    int n, m;
    while(cin >> n)
    {
        int i, j;
        for(i = 0; i < n; i++)
        {
            cin >> Agent[i]; 
        }
        cin >> m;
        for(i = 0; i < m; i++)
        {
            cin >> Server[i];
        }
        int ans = 0;
        int index = 0;
        bool flag = true;
        while(flag && index < m)
        {
        	int max = 0;
            for(i = 0; i < n; i++)
            {
                for(j = index; strcmp(Agent[i], Server[j]) && j < m; j++)
				{
					//cout << "string is not equal" << Agent[i] <
                }
                if(max < j - index)
                {
                    max = j - index;
                }
            }
            if(max == 0)
                flag = false;
            index += max;
            ans++;
        }
        if(flag)
            cout << ans - 1 <<endl;
        else
            cout << "-1" <<endl;
    }
    return 0;
}