山东济南彤昌机械科技有限公司 山东济南江鹏工贸游有限公司

bzoj 1034 [ZJOI2008]泡泡堂BNB(贪心)

 

【题目链接】

 

  http://www.lydsy.com/JudgeOnline/problem.php?id=1034

 

【题意】

 

  给两个序列以任意顺序比较,求出最大和最小得分。

 

【思路】

  

  排序后使用贪心。

  最小的能赢就赢,最大的能赢就赢,否则用最小的比最大的。

 

【代码】

 1 #include<cstdio>
 2 #include<cstring>
 3 #include<iostream>
 4 #include<algorithm>
 5 using namespace std;
 6 
 7 const int N = 3e5+10;
 8 
 9 int a[N],b[N],n;
10 
11 void read(int& x)
12 {
13     char c=getchar(); int f=1;x=0;
14     while(!isdigit(c)) { if(c=='-')f=-1; c=getchar(); }
15     while(isdigit(c)) x=x*10+c-'0',c=getchar();
16     x*=f;
17 }
18 int solve(int* a,int* b)
19 {
20     int l1=1,r1=n,l2=1,r2=n;
21     int res=0;
22     while(l1<=r1&&l2<=r2)
23     {
24         if(a[l1]>b[l2]) { res+=2; l1++; l2++; }
25         else if(a[r1]>b[r2]) { res+=2; r1--,r2--; }
26         else {
27             res+=a[l1]==b[r2];
28             l1++,r2--;
29         }
30     }
31     return res;
32 }
33 
34 int main()
35 {
36     read(n);
37     for(int i=1;i<=n;i++) read(a[i]);
38     for(int i=1;i<=n;i++) read(b[i]);
39     sort(a+1,a+n+1);
40     sort(b+1,b+n+1);
41     printf("%d %d",solve(a,b),2*n-solve(b,a));
42     return 0;
43 }

 

posted on 2016-03-11 08:28  hahalidaxin  阅读(229)  评论(0编辑  收藏  举报