bzoj 1034: [ZJOI2008]泡泡堂BNB

2016-06-20

一读完题目,马上就想到了田忌赛马,应该是贪心吧,就开始尝试各种姿势的贪心,最后受不鸟看了题解(果然我还是蒟蒻)

我们可以先排序(废话),对于最大值,我们从两头开始最弱的和最弱的比,最强的和最强的比  ,如果能打过就打,否则就让最弱的打敌方最强的,(平局不是能打过)

对于最小值,就是让敌方取最大值,毕竟总分一定。

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<cstdlib>
 5 #include<algorithm>
 6 #include<queue>
 7 #define M 200000
 8 #define ll long long
 9 #define Mo 12345678
10 using namespace std;
11 ll read()
12 {
13     char ch=getchar();
14     ll x=0,f=1;
15     for(;ch<'0'||ch>'9';ch=getchar())
16       if(ch=='-')
17         f=-1;
18     for(;ch>='0'&&ch<='9';ch=getchar())
19       x=x*10+ch-'0';
20     return x*f;
21 }
22 int ans,n,a[M],b[M],an;
23 int main()
24 {
25     n=read();
26     for(int i=1;i<=n;i++)
27       a[i]=read();
28     for(int i=1;i<=n;i++)
29       b[i]=read();
30     sort(a+1,a+n+1);
31     sort(b+1,b+n+1);
32     int l1,l2,r1,r2;
33     l1=l2=1;
34     r1=r2=n;
35     for(;l1<=r1;)
36       {
37           for(;a[l1]>b[l2]&&l1<=r1;l1++,l2++,ans+=2);
38           for(;a[r1]>b[r2]&&l1<=r1;r1--,r2--,ans+=2);
39           if(a[l1]==b[r2])
40             ans++;
41         l1++;
42           r2--;
43       }
44     printf("%d ",ans);
45     l1=l2=1;
46     r1=r2=n;
47     for(;l1<=r1;)
48       {
49           for(;b[l1]>a[l2]&&l1<=r1;l1++,l2++,an+=2);
50           for(;b[r1]>a[r2]&&l1<=r1;r1--,r2--,an+=2);
51           if(b[l1]==a[r2])
52             an++;
53         l1++;
54           r2--;
55       }
56     printf("%d\n",2*n-an);
57     return 0;
58 }

 

posted @ 2016-06-20 09:19  xiw5  阅读(133)  评论(0编辑  收藏  举报