B
来源:互联网 发布:程序员论坛排名 编辑:程序博客网 时间:2024/04/27 14:24
题目编号:B(1001)
题目大意:题意不是很难。有一堆木棒,它有长度和质量2个属性。首先放第一个木棒,需要一分钟,把其他的木棒排在它后面,当后面的木棒的长度和质量都在其之上时,不需 要时间,否则需要额外加一分钟,要求把题目给的木棒都放在一起。求最小的时间。
解题思路:思路不是很难,一般的同学都可以想到的:首先创建个结构体数组,里面有3个属性,长度,质量和是否已用这个标记。创建结构体的时候记得重载一下小于号,为下 面的排序函数做准备。准备工作好了然后就是主函数了:首先输入题目要给的数据,输入进数组中,并标记全部为未用,然后排序。后面就是2个循环体的嵌套了。具 体解决的是:筛选一下前面的是否为已用,当已经被实用则外面的循环继续。否则进入下一个循环,目的是找到此长度和质量都比它大或者等于的,而且还未被用过的 木棒,找到了以后,把标记全部为已用。当然时间这个标量也要插在其中,考虑第一个的一分钟等等,这个不是很难。最后输出就行了。
解题感想:这个题目思路不是很难想,但细节需要把握准确的,我提交了多次才A,差点就暴走了。主要还是心态,细节决定成败!!!
#include<iostream>#include<algorithm>using namespace std;struct group{ int x; int y; int A; bool operator<(const group &a)const{ if(x!=a.x) { return x<a.x;} else { return y<=a.y;} }}G[5001];int main(){ int n,a,s; int i,j,k; cin>>n; while(n--) { cin>>a; for(i=0;i<a;i++) { cin>>G[i].x>>G[i].y; G[i].A=0; } sort(G,G+a); s=0; for(i=0;i<a;i++) { if(G[i].A==0) { s++; G[i].A=1; k=G[i].y; for(j=i+1;j<a;j++) { if(k<=G[j].y&&G[j].A==0) { G[j].A=1; k=G[j].y; } } } } cout<<s<<endl; } return 0;}
0 0