[ZJOI2008]泡泡堂(田忌赛马贪心)
生活随笔
收集整理的這篇文章主要介紹了
[ZJOI2008]泡泡堂(田忌赛马贪心)
小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
problem
洛谷鏈接
solution
田忌賽馬孿生兄弟。
浙江選手最壞情況就是外省最好情況,所以本質上兩個子問題是同一個做法。
相信所有人都是讀完題后就有田忌賽馬的思想了。(如果還沒上過小學語文課的當我沒說)
實力強的去虐實力菜的,而且為了自己隊友實力考慮,肯定是把比自己菜的對手當中最強的整死。
假設兩組實力相當的比賽,得分是 222,那么自己實力強的虐對方實力弱的,自己實力弱的送給對方實力強的虐,得分也是 222。所以這種打實力差的方式是不劣的。
但是這只是對于一個人的實力而言的最優方式。
因為平局的可能性,我們還需要統籌安排是哪個實力先出戰。
在上述虐菜的前提下,我們還要盡可能地保留實力更強者,和外省的更強實力再一絕高下。
給一組數據幫助理解 2 4 10 10 10 9 1 3 5 7 8 9 最好得分:1-2 3-4 9-9 5' 所以不能先從實力強的開始去找菜雞對手所以我們應當按照實力從低到高匹配對手。
如果當前這名選手沒有比他更菜的對手(最多可能有實力相當的對手)就暫時跳過。
最后剩下的若干名實力要么就是比對方菜的要么就是實力相當的。
這時候再來統計平局的分數。
不能將平局和虐菜放在一起,原因類似的有可能后面某個實力強的隊友只能虐現在這個和自己實力相當的對手,那肯定是犧牲自己平局分數換取隊友獲勝分數。
給一組數據 1 3 1 10 最好得分:2在考場上我的實現略丑,但本質是一樣的。
時間復雜度 O(nlog?n)O(n\log n)O(nlogn),如果寫個基排就能做到 O(n)O(n)O(n)。
應該不會有絲箔卡 log?\loglog 吧 …\dots…
code
#include <bits/stdc++.h> using namespace std; #define maxn 100005 int n, ans1, ans2; bool vis[maxn]; int w1[maxn], w2[maxn]; multiset < int > s;int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) scanf( "%d", &w1[i] );for( int i = 1;i <= n;i ++ ) scanf( "%d", &w2[i] );sort( w1 + 1, w1 + n + 1 );for( int i = 1;i <= n;i ++ ) s.insert( w2[i] );for( int i = 1;i <= n;i ++ ) {auto it = s.lower_bound( w1[i] ); vis[i] = 1;if( it == s.begin() ) { vis[i] = 0; continue; }else -- it, s.erase( it ), ans1 += 2;}for( int i = n;i;i -- )if( ! vis[i] ) {if( *s.begin() == w1[i] ) ans1 ++;s.erase( s.begin() );}sort( w2 + 1, w2 + n + 1 );for( int i = 1;i <= n;i ++ ) vis[i] = 0, s.insert( w1[i] );for( int i = 1;i <= n;i ++ ) {auto it = s.lower_bound( w2[i] ); vis[i] = 1;if( it == s.begin() ) { vis[i] = 0; continue; }else -- it, s.erase( it );}for( int i = n;i;i -- )if( ! vis[i] ) {if( *s.begin() == w2[i] ) ans2 ++;else ans2 += 2;s.erase( s.begin() );}printf( "%d %d", ans1, ans2 );return 0; } #include <bits/stdc++.h> using namespace std; #define maxn 100005 int n; int w1[maxn], w2[maxn];int solve( int w1[], int w2[] ) {int ans = 0, l1 = 1, l2 = 1, r1 = n, r2 = n;while( l1 <= r1 and l2 <= r2 ) {if( w1[l1] > w2[l2] ) ans += 2, l1 ++, l2 ++;else if( w1[r1] > w2[r2] ) ans += 2, r1 --, r2 --;else ans += w1[l1] == w2[r2], l1 ++, r2 --;}return ans; }int main() {scanf( "%d", &n );for( int i = 1;i <= n;i ++ ) scanf( "%d", &w1[i] );for( int i = 1;i <= n;i ++ ) scanf( "%d", &w2[i] );sort( w1 + 1, w1 + n + 1 );sort( w2 + 1, w2 + n + 1 );printf( "%d %d\n", solve( w1, w2 ), (n << 1) - solve( w2, w1 ) );return 0; }總結
以上是生活随笔為你收集整理的[ZJOI2008]泡泡堂(田忌赛马贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: [ZJOI2007]报表统计(链表法+s
- 下一篇: 铭凡 UM780 XTX 迷你主机售价