HDU ACM 1052

數組T[] K[]分別表示田和king 的馬, 按從塊到慢進行排序。

然後從t=0 k=0 開始, 一直到k >= n爲止結束(t不用遍歷完的, 因爲後面幾匹最慢的是炮灰,和king比較快的馬比了)。

1,如果T[ t ] < K[ k ] 分兩種情況 : 

(1) 前面沒有更快的馬打平,或者是mark記錄的值和這K的一匹一樣(用mark 記錄打平的馬的速度, e表示打平的次數)。如:  T :   5  3  2  2 ;    K:   5  5  5  1;  於是K[k] 肯定贏了,, 然後k++,t保持不變(用後面跑的很慢的的炮灰和K[k] 比

  ( 2 )  前面打平了的 那匹馬的速度 比K[ k ] 快, 也就是 mark > K[ k ]

             比如 : T :   5  3  2  ;  

                          K:   5  4 1  ;

         那麼這時候只 相當於   T  用5 贏 K的 4,  然後用最後的炮灰來輸給 K 的5,再把e--, 因爲 保存着的5 只打平一次, 下次出現這種情況就不能用了。

 2, 如果 T[ t ] = K [k]   也是兩種情況  : 

(1):

  if(e==0||mark == T[t])
{
mark = T[t];
e++;
t++;
k++;
}
 e =  0 ; 表示前面沒有打平, 或者打平了, 但是出現了上面( 2 ) 中出現的情況。 

  mark 是之前打平的馬的速度。  如果mark 和T[ t ]  一樣大, 說明此次打平的馬的速度和上次打平的馬的速度一樣塊,於是e++;

(2) :  打平了, 但是T[ t ] = K[k] < mark  ,   T 用速度爲mark 的馬來贏 K[k]  ,  用後面跑的很慢的炮灰輸給K中速度爲mark 的馬,  於是e--; 

 注意到, 當出現1(2)  或者 2 (2) 的時候, 其實相當於是贏一場輸一場,不影響結果(T用mark了的馬 贏K[k],T後面的炮灰輸給K的mark)。 

                                                                                                               

3,如果T[t]  > K [k]  就最好了。。 直接過。。

#include<iostream>
using namespace std;
int T[1000];
int K[1000];
void sort_(const int &n_)
{
	int tmp;
	for(int i = 0 ; i < n_ ; i++)
		for(int j = 1 ; j < n_-i ; j++)
		{
			if(T[j] > T[j-1])
			{
				tmp = T[j];
				T[j] = T[j-1];
				T[j-1] = tmp;
			}
			if(K[j] > K[j-1])
			{
				tmp = K[j];
				K[j] = K[j-1];
				K[j-1] = tmp;
			}
		}
}
int main()
{
	int n,t,k,e,res,mark;
	int a = 1;
	while(scanf("%d",&n),n!=0&&a<=50)
	{
		for(int c = 0 ; c < n ; c++)scanf("%d",&T[c]);
		for(int c = 0 ; c < n ; c++)scanf("%d",&K[c]);
		sort_(n);
		t = k = e = res = 0;
		while(k < n)
		{
			if(T[t] > K[k])
			{
				res++;
				t++;
				k++;
				continue;
			}			
			if(T[t] < K[k])
			{
				if(e>0&&K[k]<mark)e--;
				//if(e>0)e--;              // 開始一直wa, 就因爲這裏考慮漏掉了K[k] = mark 而 T[t] <mark 的情況。
				else res--;
				k++;
				continue;
			}
			if(T[t] == K[k])
			{
				if(e==0||mark == T[t])
				{
					mark = T[t];
					e++;
					t++;
					k++;
				}
				else if(mark > K[k] )
				{
					e--;
					k++;
				}
				continue;
			}
		}
		cout << res*200 <<endl;
		a++;
	}
	return 0;
}

發佈了25 篇原創文章 · 獲贊 2 · 訪問量 1萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章