USACO第四题Milking Cows
虽然有明显的贪心思想,我还是有足够的wa去纠结。奶牛貌似很受美国人欢迎,哪儿都有。由于英语不太好,题目看的不明不白,尤其是细节方面的东西。比如有可能没有间隔,那就得输出0,要是不看测试数据今晚都得纠结在这。硬是逼我加了个flag进去。虽然这手段比较猥琐,但是用惯了。还有需要注意的就是可能有个区间被另外一个区间包含也说不定,测试数据总是会想方设法挑你毛病,如果多看看测试数据,没准还能上TC上去找别人的茬。快排加上几个细节,这个入门题就没什么难的了。
/* ID: like_091 PROG: milk2 LANG: C++ */ #include<iostream> #include<fstream> #include<algorithm> #include<string> using namespace std; const int MAX = 5001; struct Node{ int start, end; }node[MAX]; //为qsort准备的自定义比较函数,很有用 int cmp(const void *a, const void *b) { struct Node *c = (Node *)a; struct Node *d = (Node *)b; if (c->start != d->start) return c->start - d->start; else return d->end - c->end; } int main(void) { ifstream cin("milk2.in"); ofstream cout("milk2.out"); int n, maxx, minx, temp; short i; cin>>n; for (i = 0; i < n; i++) cin>>node[i].start>>node[i].end; qsort(node, n, sizeof(node[0]), cmp); maxx = -1;//只要有输入,初始化为-1总没错的 minx = 0;//小心只有一行数据,初始化为0 bool flag = true; temp = node[0].end - node[0].start; for (i = 1; i < n; i++) { if (node[i].start <= node[i - 1].end) { if (node[i].end > node[i - 1].end) temp += (node[i].end - node[i - 1].end); else node[i].end = node[i - 1].end; } else { if (maxx < temp) maxx = temp; if (flag) { //我承认此处比较那个,你懂的 minx = node[i].start - node[i - 1].end; flag = false; } //注意是求最大的,不要因此wa if (minx < node[i].start - node[i - 1].end) minx = node[i].start - node[i - 1].end; temp = node[i].end - node[i].start; } } //按我的理解后面这一步是不能省的 if (maxx < temp) maxx = temp; cout<<maxx<<" "<<minx<<endl; return 0; }