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;
}		

原始博客地址
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值