p3697桌球比賽
時間限制 :- ms空間限制 :65536 kb
評測說明 :時限1000ms
問題描述
輸入格式n個桌球愛好者站成一排,從左往右編號1到n。他們要組織比賽切磋技術。每個人都有乙個不同的技能值,編號i個人的技能值為ai。
每場比賽需要3個人:兩名選手,一名裁判。要求作為裁判的那乙個桌球愛好者所站的位置必須在兩名選手的之間,並且技能值也在兩名選手的之間。
問一共能組織多少場不同的比賽。
輸出格式第一行,乙個整數n。
第二行,n個空格間隔的整數,按照從左往右的順序給出了每個桌球愛好者的能力值ai。
一行,乙個整數,表示所求結果
樣例輸入 1
樣例輸出 13
1 2 3
1
樣例輸入 2
樣例輸出 25
9 1 4 3 6
3
樣例輸入 3
樣例輸出 37
7 10 5 4 8 1 6
9
提示
** 改編自la 43293<=n<=50000
1<=ai<=200000
這個題目要用樹狀陣列
而且需要一點點組合的意識
我們討論每個人當裁判的情況
例如
於是,這道題目的解法出來了技能值 1 7 6 4 2 3 5
我們**技能值為4的人當裁判的情況
他左邊有1個比他弱的人,右邊有1個比他強的人
所以這些人可以打:
1*1=1組比賽
他左邊有2個比他強的人,右邊有2個比他弱的人
所以這些人可以打:
2*2=4組比賽(每乙個左邊的比他弱的人都可以和每乙個右邊比他強的人打比賽)
以每個人當裁判為不同的情況
那麼每個人當裁判能夠主持的比賽數即為
左邊比他弱的人數*右邊比他強的人數+左邊比他強的人數*右邊比他弱的人數
那麼我們如何統計哪些人比他弱,哪些人比他強呢??
這裡就不做**,直接告知方法了
對於每一次輸入,由於是按順序的,我們就可以按照順序把能力值打上標記
這樣子每一次輸入之後,我們都可以統計出他左邊比他弱/強的人的個數例如
求完之後,再將他的能力值標上標記即可人的技能值 1 7 6 4 2 3 5
假設我們輸入到第四個人了
那麼輸入之前標記
1 2 3 4 5 6 7(這一行代表技能值)
1 1 1(這一行代表標記)
輸入第四個人的技能值為4
那麼我們只需要求比4低的值標記之和(=1)
就能求出,他左邊有1個人比他弱
又由於此時除他之外共有3個人,那麼左邊比他強的人的個數=3-1=2
所以他左邊比他弱的人=1
比他強的人=2
那麼如何求他右邊比他弱/強的人的個數呢??
我們可以在輸入完成之後,求出全場比他弱的人
已知全場比他弱的人有x個,他左邊比他弱的人有y個
那麼他右邊比他弱的人就有(x-y)個
同理可得右邊比他強的人
①如何分類討論比賽個數??
②如何用數狀陣列求出左邊比他強/弱的人的個數??
#include
#include
using
namespace
std;
inline
int input()//輸入優化
long
long res=0;
int n,x[51234];
int c[201234],higher[51234],lower[51234],found[201234];
int lowbit(int x)
int find(int x)
void add(int x)
int main()
for(int i=1;i<=n;i++)
printf("%lld",res);
}
C 桌球比賽
使用vs2019 iso c 14 標準 std c 14 兩個桌球隊進行比賽,各出三人。甲隊為a,b,c三人,乙隊為x,y,z三人。已抽籤決定比賽名單。有人向隊員打聽比賽的名單。a說他不和x比,c說他不和x,z比,請程式設計序找出三隊賽手的名單。演算法1 侷限性 abc按順序匹配,先匹配c,再匹配...
桌球比賽模擬
from random import random defprintinfo print 這個程式模擬兩個選手a和b的桌球比賽 print 程式執行需要a和b的能力值 以0到1之間的小數表示 defgetinputs a eval input 請輸入選手a的能力值 0 1 b eval input ...
桌球比賽(模擬演算法)
題目描述 華華通過以下方式進行分析,首先將比賽每個球的勝負列成一張表,然後分別計算在11分制和21分制下,雙方的比賽結果 截至記錄末尾 比如現在有這麼乙份記錄,其中w表示華華獲得一分,l表示華華對手獲得一分 wwwwwwwwwwwwwwwwwwwwwwlw 在11分制下,此時比賽的結果是華華第一局1...