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 <

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<

C:

这道题,是我最近三年第一次写二分,之前貌似还是大二的时候。这次的二分是要返回数组中第一个小于或等于某个key的下标,主要是在原来二分相等那里加一些判断。
然后我以为我写好了,过了前面13个测试样例,然后就一直卡
但是我却一直卡住:主要由两点
1 ,刚开始 先确定 第1 和第二 个元素,然后再来确定第三个元素,这和之前看错题有关,然后超时,发现直接确定第一和第三个点,就ok
2 ,有些运算要用 long long ,我只是把结果的变量 用了long long
3 , 二分写错了

using namespace std;

int n ,d;

const int N = 100000 + 10;
vector 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;
}		

原始博客地址

你可能感兴趣的:(ACM,数据结构,和,算法)