BZOJ1034: [ZJOI2008]泡泡堂BNB
题目描述里的非主流配图…
这道题做法和田忌赛马差不多,先把自己和对手都排个序,只要按照下面的流程走就行了:
1.尽量用自己最优的干掉对方最优的 ans+=2
2.尽量用自己最矬的干掉对方最矬的 ans+=2
3.用自己最矬的一个干掉对方最优的 ans+=(两者是否相同)? 1:0
而自己最坏的情况,只要用对手最优的情况反着来一次。
1 /************************************************************** 2 Problem: 1034 3 User: zhuohan123 4 Language: C++ 5 Result: Accepted 6 Time:252 ms 7 Memory:2132 kb 8 ****************************************************************/ 9 10 #include <iostream> 11 #include <cstdio> 12 #include <algorithm> 13 using namespace std; 14 int n,a[110000],b[110000]; 15 int main(int argc, char *argv[]) 16 { 17 scanf("%d",&n); 18 for(int i=1;i<=n;i++)scanf("%d",&a[i]); 19 sort(a+1,a+n+1); 20 for(int i=1;i<=n;i++)scanf("%d",&b[i]); 21 sort(b+1,b+n+1); 22 int ans=0,al=1,ar=n,bl=1,br=n; 23 while(al<=ar&&bl<=br) 24 { 25 while(a[al]>b[bl]&&al<=ar&&bl<=br)al++,bl++,ans+=2; 26 while(a[ar]>b[br]&&al<=ar&&bl<=br)ar--,br--,ans+=2; 27 if(al<=ar&&bl<=br)ans+=(a[al]==b[br]),al++,br--; 28 } 29 printf("%d ",ans); 30 for(int i=1;i<=n;i++)swap(a[i],b[i]); 31 ans=0,al=1,ar=n,bl=1,br=n; 32 while(al<=ar&&bl<=br) 33 { 34 while(a[al]>b[bl]&&al<=ar&&bl<=br)al++,bl++; 35 while(a[ar]>b[br]&&al<=ar&&bl<=br)ar--,br--; 36 if(al<=ar&&bl<=br)ans+=(a[al]==b[br])?1:2,al++,br--; 37 } 38 printf("%d\n",ans); 39 return 0; 40 }