有的时候总会去想如何才能用更少的时间复杂度来解决问题,但是有的时候 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;
}
原始博客地址