codeforces 197 2

来源:互联网 发布:linux的vim命令 编辑:程序博客网 时间:2024/06/06 01:26

本来昨天做完题还很高兴的,因为发现五道题都有思路的,并且交了之后都是临时数据都过了,才花了一个半小时,于是感觉心情很舒畅的睡觉了,然而早上一开电脑就发现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 1005int 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;}


原创粉丝点击