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 }