Online Judge | Problem Set | Authors | Online Contests | User | ||||||
---|---|---|---|---|---|---|---|---|---|---|
Web Board Home Page F.A.Qs Statistical Charts | Current Contest Past Contests Scheduled Contests Award Contest |
说说一下注意的几个地方,贴代码,飘过~~网上有分类把他归为动态规划类型的题目,结果读完题才发现是道最基本的贪心题目,不过因为规模较小,完全可以水过。按照给你的数据,把数据按照右边界进行排序,然后测试在每一段范围内冲突的个数,找出所欲范围内冲突个数的最大值,即为我们所要求解的结果。需要注意的两点问题——1. 输入的时候不一定是按照从小号房间往大号房间搬的方向的,也有可能是从大号房 间搬向小号房间,不过他们造成的冲突影响是一样的,所以首先要进行比较,然后再进行范围的存储;2.走廊的范围确定,如果小范围为偶数,需要减1,如果大范围为奇数,需要加1,看图就明白了,既对于数据 10 2 1 3 4 5 输出的结果应该为20而不是10,因为3和4从图上来看其实也是冲突的,注意了这一点之后此题就好做了。 #include <iostream> #include <algorithm> using namespace std; struct pos { int le; int ri; }mov[201]; bool cmp(pos a,pos b) { return a.ri < b.ri; } int main() { int t,n,i,j,smax,cmax; scanf("%d",&t); while(t--) { scanf("%d",&n); for(i = 0;i < n;i++) { scanf("%d%d",&mov[i].le,&mov[i].ri); if(mov[i].le > mov[i].ri) {int temp = mov[i].le;mov[i].le = mov[i].ri;mov[i].ri = temp;} } sort(mov,mov + n,cmp); smax = 0; for(i = 0;i < n;i++) { cmax = 0; for(j = i;j < n;j++) { if(mov[i].ri > mov[j].le) cmax ++; else if(mov[i].ri % 2 == 1) if(mov[j].le == mov[i].ri + 1) cmax ++; else if(mov[i].ri % 2 == 2) if(mov[j].le == mov[i].ri -1) cmax ++; else break; } if(cmax > smax) smax = cmax; } printf("%d\n",smax * 10); } return 0; } Followed by: Post your reply here: |
All Rights Reserved 2003-2013 Ying Fuchen,Xu Pengcheng,Xie Di
Any problem, Please Contact Administrator