日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[ZJOI2008]泡泡堂(田忌赛马贪心)

發布時間:2023/12/3 编程问答 40 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [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]泡泡堂(田忌赛马贪心)的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。