BZOJ1658 [Usaco2006 Mar]Water Slides 滑水

说好的一天题解来啦!

首先作为usaco的silver题,我被虐了。。。调了两天才搞定

最后发现是sort忘了+1(start + cnt1 (+ 1))还去问管理员要了数据,真是。。。

做法倒不是很难想:

(1)把点分成出度>入度和入度>出度两种

(2)跑一遍网络流

好像会T的很惨。。。然后改进:

发现两条线段交叉一定没有不交叉来得好(就是简单地贪心思想)

于是两类点排序,直接一个一个配对答案一定是最小的。

 

 1 /**************************************************************
 2     Problem: 1658
 3     User: rausen
 4     Language: C++
 5     Result: Accepted
 6     Time:32 ms
 7     Memory:1040 kb
 8 ****************************************************************/
 9  
10 #include <cstdio>
11 #include <algorithm>
12  
13 using namespace std;
14  
15 int n, m, ans, cnt1, cnt2, X, Y;
16 int deg[15000], start[15000], stop[15000], pos[15000];
17  
18 int main(){
19     scanf("%d%d", &n, &m);
20     for (int i = 1; i <= n; ++i)
21         scanf("%d", pos + i);
22     for (int i = 1; i <= m; ++i){
23         scanf("%d%d", &X, &Y);
24         ++deg[X], --deg[Y];
25     }
26  
27     for (int i = 1; i <= n; ++i){
28         for(; deg[i] > 0; --deg[i]) start[++cnt1] = pos[i];
29         for(; deg[i] < 0; ++deg[i]) stop[++cnt2] = pos[i];
30     }
31  
32     sort(start + 1, start + cnt1 + 1);
33     sort(stop + 1, stop + cnt2 + 1);
34      
35     for (int i = 1; i <= cnt1; ++i)
36         ans += abs(start[i] - stop[i]);
37     printf("%d\n", ans);
38     return 0;
39 }
View Code

 

转载于:https://www.cnblogs.com/rausen/p/4032229.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值