有的時候總會去想如何才能用更少的時間複雜度來解決問題,但是有的時候 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;
}
原始博客地址