Codeforces Round #153 (Div. 2)

有的時候總會去想如何才能用更少的時間複雜度來解決問題,但是有的時候 ACM需要快速的敲出代碼,要利用暴力得到一個簡潔的解決方案。

A : http://codeforces.com/contest/252/problem/A

暴力

int data[110];
int main()
{

	int n;
	cin>>n;
	for(int i = 1 ;  i <= n ; i ++ ) cin>>data[i];

	int maxn = -1;
	int x;
	for(int i = 1 ; i <= n  ; i ++){
		x = data[i];
		if(x > maxn)  maxn  =x ;
		for(int j = i + 1 ; j <= n ; j ++){
			x ^= data[j];
			if(x > maxn)  maxn  =x ;
		}
	}

	cout << maxn <<endl;
	return 0;

}

B:

也是暴力 ,寫個函數判斷一個序列是不是已經排序好,然後一個一個試,看交換是否讓他不是排序好了的

const int N  = 100000 + 10;
int data[N];

bool isSort(int n)
{
	//int flag = data[1] > data[2] ?1 : 0;
	int i = 1;
	int flag = 1;
	while(i < n){
		if(data[i] != data[i+1] )  {
			flag = data[i] > data[i+1] ?1 : 0 ;
			break;
		}
		i ++;
	}


	if(flag == 1){
		for(int i = 1 ; i <  n ; i ++){
			if(data[i] < data[i + 1]) return false;
		}
	}
	else{
		for(int i = 1 ; i <  n ; i ++){
			if(data[i] > data[i + 1]) return false;
		}
	}

	return true;
}
int main()
{
	int n ;
	cin>>n;
	for(int i = 1 ; i <= n ; i ++) cin>>data[i];
	
	if(n == 1 || n== 2 ){
		cout<<-1<<endl;
	}
	else {
		for(int i = 1 ; i < n ; i ++){
			if(data[i] != data[i+1]){

				swap(data[i],data[i+1]);
				if (isSort(n)){
					swap(data[i],data[i+1]);
				}
				else{
					cout << i << " " << i +1 <<endl;
					return 0;
				}
			}
		}
		cout << -1 <<endl;


	}


	return 0;
}

C:

這道題,是我最近三年第一次寫二分,之前貌似還是大二的時候。這次的二分是要返回數組中第一個小於或等於某個key的下標,主要是在原來二分相等那裏加一些判斷。
然後我以爲我寫好了,過了前面13個測試樣例,然後就一直卡
但是我卻一直卡住:主要由兩點
1 ,剛開始 先確定 第1 和第二 個元素,然後再來確定第三個元素,這和之前看錯題有關,然後超時,發現直接確定第一和第三個點,就ok
2 ,有些運算要用 long long ,我只是把結果的變量 用了long long
3 , 二分寫錯了

using namespace std;

int n ,d;

const int N = 100000 + 10;
vector<int> data;


// 得到最後一個小於等於key 的下標 ,數組是升序的
int _bsearch(int l ,int r ,int  key){

	int mid = 0;
	while( l <= r ){

		mid = (l + r) >> 1;
		if(data[mid] == key  ||  
			(data[mid] < key && (mid == r || (mid+1 <= n && data[mid+1] > key ))) ){ // 錯在 mid + 1 < n ,沒加等號 真想抽自己一耳光(data[mid] < key && (mid == r || (mid+1 < n && data[mid+1] > key ))) ){ 
				return mid;
		}
		else if(data[mid] < key){
			l = mid + 1;

		}
		else
			r = mid -1;
	}

	return 0;
}


int main()
{
	scanf("%d%d",&n,&d);
	data.push_back(0);
	for(int i = 1 ; i <= n ; i ++) {

		int nnum;
		cin>>nnum;
		data.push_back(nnum);
	} 

	__int64  ans  = 0;
	for(int i = 1 ; i <= n - 2 ; i ++){
		//int pos = int (upper_bound( data.begin() + 1 ,data.end(),data[i] + d )-data.begin() -1 );
		int pos = _bsearch(i + 1 ,n , data[i] + d);

		if(pos - i >= 2) {
			ans += (__int64)(pos-i)*(pos-i-1)/2;
		}
	}

	printf("%I64d\n",ans);

	return 0;
}		

原始博客地址
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章