codeforces 197 2

本來昨天做完題還很高興的,因爲發現五道題都有思路的,並且交了之後都是臨時數據都過了,才花了一個半小時,於是感覺心情很舒暢的睡覺了,然而早上一開電腦就發現wa了兩道題,抓狂!!!!就是第三題和第五題,盧學長的情況和我一樣,wa的原因都一樣。。。今天做topcoder我們兩個還是一樣的,看來以後我們兩個一塊做題一個人的bug是不容易被另外一個人發現的。。。。

首先說第三題:幾乎所有的人都可以想到貪心的,就是每次使得兩個托盤的重量之差最小,但是卻忘記了枚舉最開始放入托盤時候物體的重量而是將第一個先放在了上面,好多人WA在了此處。。。

第五題:我昨天想的思路是找到一個界限,使得a[i],到a[j]之間的值在i和j中間,然後就是在這個區間中進行交換,昨天晚上wa在了第七個樣例是因爲我輸出的順尋反了自己都無語了),然後今天改了下發現又wa在了第8個樣例,因爲在那個區間上寫的很死板,就是沒有一點的迴旋餘地,轉換的次數都有可能超過三了,然後今天看了別人的代碼,用的是枚舉加搜索,換句話說,我的思路是錯的啦。。。

下面的是第五題的代碼:

#include<iostream>
#include<cstdio>
#include<string>
#include<cstring>
#include<cmath>
#include<algorithm>
#include<queue>
#include<stack>
#include<vector>
#include<climits>
#include<map>
using namespace std;

#define rep(i,n) for(int i=0; i<n; i++)
#define repf(i,n,m) for(int i=(n); i<=(m); ++i)
#define repd(i,n,m) for(int i=(n); i>=(m); --i) 
#define ll long long
#define arc(a) ((a)*(a))
#define inf 100000
#define exp 0.00000001
#define N 1005
int a[N];
int n;
struct node
{
	int x,y;
	node() {};
	node(int _x,int _y):x(_x),y(_y){}
};
vector<node>vec;
int getl()
{
	repf(i,1,n) 
		if(a[i]!=i)
			return i;
	return 0;
}
int getr()
{
	repd(i,n,1)
		if(a[i]!=i)
			return i;
	return 0;
}
int getp(int x)
{
	repf(i,1,n)
		if(a[i]==x)
			return i;
}
void trans(int l,int r)
{
	repf(i,l,(l+r-1)/2)
		swap(a[i],a[l+r-i]);
}
bool dfs(int s)
{
	if(s==5) return false;
	int l=getl();
	int r=getp(l);
    if(l==0) return true;
	trans(l,r);
	if(dfs(s+1)){
		vec.push_back(node(l,r));
		return 1;
	}
	trans(l,r);
	r=getr();
	l=getp(r);
	trans(l,r);
	if(dfs(s+1)) 
	{
		vec.push_back(node(l,r));
		return 1;
	}
	trans(l,r);
    return 0;
}
int main()
{
	while(scanf("%d",&n)!=EOF)
	{
		int l=-1,r=-1;
		vec.clear();
		repf(i,1,n)
			scanf("%d",&a[i]);
		dfs(1);
		printf("%d\n",vec.size());
		rep(i,vec.size())
			printf("%d %d\n",vec[i].x,vec[i].y);
	}
	return 0;
}


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