2017年5月20日 星期六

b549 數位相片檔名

/*
b549 nr102-5 北二區102年-5 數位相片檔名 
*/
#include <iostream>
#include <iomanip>
#include <set>
#include <map>
using namespace std;

map<int,int> used;                   // 已使用的 <時間 , 檔名>
map<int,int>::iterator mit;
map<int,int>::reverse_iterator rit;

bool can(int fn)                     // 傳入的檔名是否可用(符合雙遞增)
{
    if(used.size()<2) return true;    // 只有0或1個時,一定可以 
   int cnt=1;                        // 使用的 序列數,最多2個  
   mit=used.begin();                
   int fn1=mit->second, fn2=9999 ,fn3;   //第1個使用 一個序列 
   // 若有兩個序列,維持 fn1<fn2 
   for(++mit; mit!=used.end() ; ++mit)  // 從 第2個起與前一個比 
   {
    fn3=mit->second; // 第2個起的檔案編號
    if( fn3<fn1 )
    {
    if (cnt==2 )  return false;  //已兩個再加1個 x
    ++cnt; fn2=fn1; fn1=fn3;  //保持 fn1<fn2
    }
    else // fn3>fn1 可加入 fn1或fn2
{
if(fn3>fn2) fn2=fn3; //加至較大 的序列處,保留較小的序序編號 
else fn1=fn3;   // fn3<fn2無法加至 fn2,也保證 fn1=fn3<fn2 
}
   }
   if( cnt==2 && fn<fn1 ) return false;  //已兩個再加1個 x
   else return true;
}

int main( )

{
   int n , t ;
   int fn[1000];
   char c;
   for( n=0; n<1000; ++n) fn[n] = n;
    set <int>::iterator sit;  
   bool first=true;
   while( cin >> n )
   {
      set <int> nuse(fn,fn+1000);  //待用的檔號
      used.clear();      

       while( n-- )
       {
          cin >> c >> t;
           if( c == 'A' )
          {
             for( sit = nuse.begin(); sit != nuse.end(); ++sit )
             {
                int fn = *sit;   //檢查檔名編號 fn 是否可用
                if ( !can( fn ) ) continue;   // 不能用,下一個
                used[ t ] = fn;             // t 時,加可用檔名 fn
                nuse.erase( *sit );
                break;
             }
          }
          else
          {
             nuse.insert( used[t] );   // 未用的檔名,加一個
             used.erase( t );          // 已用的 map <t,fn> 刪一個
          }
       }
// 印出,若不是第一組,則印出 --
        if(first) first=false; else cout << "--\n";  
        rit = used.rbegin();  rit++;  //先至倒數第2個 
        cout << "PIC" << setfill ('0') << setw (3) << (rit->second) << endl;
        rit--;
        cout << "PIC" << setfill ('0') << setw (3) << (rit->second) << endl;
   }
   return 0 ;
}

/* 輸入範例 
10 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 4 A 6
14 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 4 A 6 D 3 A 7 D 0 A 8
14 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 5 A 6 A 7 D 0 A 8 A 9
14 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 5 A 6 A 7 A 8 D 4 A 9
15 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 5 A 6 A 7 A 8 D 4 A 9  A 10
17 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 5 A 6 A 7 A 8 D 4 A 9  A 10 D 6 A 11
19 A 0  A 1  A 2  A 3  D 2 A 4 D 1 A 5 D 5 A 6 A 7 A 8 D 4 A 9  A 10 D 6 A 11 D 11 A 12
9 A 0 A 1 A 2 A 3 D 2 A 4 D 1 D 0 A 5
9 A 0 A 1 A 2 A 3 D 2 A 4 D 1 A 5 A 6
10 A 0 A 1 A 2 A 3 A 4 D 2 A 5 A 6 D 3 A 7
輸出範例-----------------
PIC004
PIC001
--
PIC002
PIC003
--
PIC006
PIC007
--
PIC006
PIC001
--
PIC001
PIC002
--
PIC002
PIC004
--
PIC002
PIC004
--
PIC002
PIC004
--
PIC004
PIC005
--
PIC005
PIC003
*/

0 意見:

張貼留言