奇安信(2019筆記試験問題)


40パス選択(40分)2パスプログラミング(60分)
1.チーム末尾ラッキーナンバー
時間制限:C/C++言語1000 MS;その他言語3000 MSメモリ制限:C/C++言語65536 KB;その他の言語589824 KB
タイトルの説明
N人は一列に並んで、1から5まで順番に数えて、5を報告する人は幸運者で、列を出ます.隊列の最後まで報告し,隊首から続けて報告する.このループに従います.問:列の最後に並んでいる人は何人目の幸運者ですか.注意:Nは100000未満の正の整数です.例えば、1人が1列に並んで、彼は1位の幸運者です.3人が一列に並んで、列の最後は2位のラッキーな人です.5人が一列に並んで、列の最後は1位のラッキーな人です.8人が一列に並んで、列の尾は3位のラッキーな人です.つまり求めます:N人は1列に并んで、列の尾は何位の幸运者ですか?
入力
チーム総人数
しゅつりょく
キャプテン翼のラッキーナンバー
サンプル入力
20
サンプル出力
4
プログラムC++
この考え方はアルゴリズムコンテスト入門経典の救済金支給(UVa 133)に由来するが,出力の値が異なることに注意する.また、この問題ではテストの値は大きくありません.残された問題はnが大きいとき、どのように解決しますか.後で更新します.
#include
#include
using namespace std;
int que[50];
int n, m;

int go(int p, int t)   //     ,                 
{ 
    while(t--)
        {
         //   
        do{ p = p % n + 1; }while(que[p]==0); //       0 ,       
    }
    return p;
}
int main()
{
    while ((cin >> n >> m) && n != 0)
        {
        for (int i = 1; i <= n; i++) que[i] = i;

        int left = n;  //     
        int p2 = 0;    //    
        int num = 0;
        while (left)
            {
            num++;
            p2 = go(p2, m);
            if(p2==n) break;//                  
                            //  ,    n         ,           
                            //        ,  p2 n ,     ,  num
            //cout << setw(3) << p2;
            left--;
            que[p2] = 0;
           // if (left) cout << ',';
            }
             cout << num << endl;
        }
   return 0;
}





2.最長重複しない文字列を求める
時間制限:C/C++言語1000 MS;その他言語3000 MSメモリ制限:C/C++言語65536 KB;その他の言語589824 KB
タイトルの説明
1行の文字列を入力して、中に重複文字が含まれていない長男の列を求めます.例えば、入力文字列がaaabbacccであれば、任意の位置からサブ文字列を切り取ることができ、これらのサブ文字列のうち、重複文字を含まない最長の文字列はabcであり、その長さは3である.
入力
文字列
しゅつりょく
重複文字を含まない最上位列の長さ
サンプル入力
bcdbcdee
サンプル出力
4
プログラムC++
#include 
#include 
#include 

using namespace std;

int LengthofLongeststring(string s)
{
   int m[256]={0};
   int left=0,ans=0;
   for(int i=0;i<s.size();i++)
   {
       if(m[s[i]]==0 || m[s[i]]<left)
       {
           ans=max(ans,i-left+1);
       }
       else
       {
          left=m[s[i]];
       }
       m[s[i]]=i+1;
   }
   return ans;
}
int main()
{
    string s;
    getline(cin,s);

    int ans;
    ans=LengthofLongeststring(s);
    cout << ans <<endl;
    return 0;
}