汇总见 http://blog.csdn.net/qyl916/article/details/12442283
这一部分的题目也很经典,虽然是一次排序解决问题,但有难度
第15题 奶牛杂技 acrobat
这种题基本上要按某种关键字排序,所以考虑相邻两头牛,他们上面的牛重量加起来是w0,若A在B上面,A受到压力为w0 - sA B受到压力为 w0 + wA - Sb.再写出反过来的情况,进行一下分析即可,最后是按W+S排序。据说把未经分析的带max的式子直接作为关键字排序也行。
struct node{ int w,s; }; int cmp(node a, node b){ return a.w + a.s < b.w + b.s; } node a[50010]; int n; int main() { scanf("%d", &n); rep1(i, n){ scanf("%d%d", &a[i].w, &a[i].s); } sort(a + 1, a + n + 1, cmp); LL ans = -INF, now = 0; rep1(i, n){ ans = max(ans, now - a[i].s); now += a[i].w; } printf("%lld\n", ans);//while(1); return 0; }
第16题 两道工序 mqueue
直接分析相邻两头牛,然后把较复杂的式子作为关键字排序就能A了,排序关键字是
return a.fi + b.se + max(a.se, b.fi) < a.se + b.fi + max(a.fi, b.se); 。。。
/* 开始感觉是按第一项工作时间排序,造出了反例 感觉是按第一道减第二道排序,写写看 又找到反例 .. 但反例找错了。。 看题解 max(AD + BD + BC, AD + AC + BC) <= max(AC + BC + BD, AC + AD + BD) <=> min(BD, AC) > min(AD, BC) 这句不懂 但再后面的关键字处理用不着,可以直接A 其实看不懂的这步也不用,直接比就行了,常数都没有影响 */ using namespace std; struct node{ int fi, se; }; bool cmp(node a, node b){ return a.fi + b.se + max(a.se, b.fi) < a.se + b.fi + max(a.fi, b.se); } node a[30000]; int n, s[30000], t[30000]; int main() { scanf("%d", &n); rep1(i, n) scanf("%d%d", &a[i].fi, &a[i].se); sort(a + 1, a + n + 1, cmp); //rep1(i, n) printf("%d %d\n", a[i].fi, a[i].se); s[0] = t[0] = 0; rep1(i, n) { s[i] = s[i - 1] + a[i].fi; t[i] = max(t[i - 1], s[i]) + a[i].se; } printf("%d\n", t[n]); //while(1); return 0; }