最后一周训练赛第一题
首先看见这道题的第一感觉真的是无法下手,除了用最笨的开数组的方法,其他的什么都想不到。但是在将解的过程中说道通过一个右端排序就可以很轻松的将问题解决,自己更是听蒙了。后来自己看见了代码,细细的研究了一会,顿时是豁然开朗。陶叔说这道题的解法之所以想得到是一种经验问题,但是看代码时我真的感觉这个代码是完完全全为这道题而写的,想不到在其他的地方还能够怎么使用这个代码。待会还会看看剩下的一些类似的例题来巩固自己吧。
这里先将别人的代码贴出来,供参考:
#include <cstdio> #include <cstring> #include <algorithm> using namespace std; const int maxn = 10100; struct Table{ int l,r; bool operator < (const Table &rhs) const{ return r < rhs.r; } }table[maxn]; //感觉上面的这种定义结构体同时还重新定义了大小比较的排序方法的这个效果自己要赶快学会,用处非常的大 int main(){ int kase,n; scanf("%d",&kase); while(kase--){ scanf("%d",&n); for(int i = 0;i < n;i++){ scanf("%d%d",&table[i].l,&table[i].r); } sort(table,table+n); int ans = 0,r = -1; for(int i = 0;i < n;i++){ if(r < table[i].l){ ans++; r = table[i].r; } } printf("%d\n",ans); } return 0; }
同样是最简单的贪心题,下面有一个几乎一样的实例,希望以后能够将这样一类问题好好的处理好——(建议是在使用贪心的过程中遇到超时等等情况,要求使用二分进行尝试)
hdu2037:点击这里
#include <iostream> #include <algorithm> #include <cstdio> using namespace std; const int maxn = 24; struct TV{ int l,r; bool operator < (const TV &rhs) const{ return r < rhs.r; } }table[maxn]; int main() { int n; while(cin>>n&&n){ for(int i = 0;i < n;i++){ scanf("%d%d",&table[i].l,&table[i].r); } sort(table,table+n); int ans = 0,r = -1; for(int i = 0;i < n;i++){ if(r <= table[i].l){ ans++; r = table[i].r; //cout<<"table[i].l"<<table[i].l<<"table[i].r"<<table[i].r<<endl; } } printf("%d\n",ans); } return 0; }
我要坚持一年,一年后的成功才是我想要的。