哎呀,最近有點懈怠了 沒辦法,初三是真的忙 我盡量 哭泣
—————————————————————————
懂的都懂,這道題是基本的列舉模擬練習
現在讓我們來看看題
—————————————————————————
題目簡述
軒軒和凱凱正在玩一款叫《龍虎鬥》的遊戲,遊戲的棋盤是一條線段,線段上有 n個兵營(自左至右編號 1∼n),相鄰編號的兵營之間相隔 1厘公尺,即棋盤為長度為 n−1 厘公尺的線段。i號兵營裡有ci 位工兵。 下面圖 1 為 n=6 的示例:
軒軒在左側,代表「龍」;凱凱在右側,代表「虎」。 他們以 m 號兵營作為分界, 靠左的工兵屬於龍勢力,靠右的工兵屬於虎勢力,而第 m 號兵營中的工兵很糾結,他們不屬於任何一方。
乙個兵營的氣勢為:該兵營中的工兵數× 該兵營到 m 號兵營的距離;參與遊戲 一方的勢力定義為:屬於這一方所有兵營的氣勢之和。
下面圖 2 為 n = 6,m=4 的示例,其中紅色為龍方,黃色為虎方:
遊戲過程中,某一刻天降神兵,共有 s1 位工兵突然出現在了 p 1號兵營。作為軒軒和凱凱的朋友,你知道如果龍虎雙方氣勢差距太懸殊,軒軒和凱凱就不願意繼續玩下去了。為了讓遊戲繼續,你需要選擇乙個兵營 p2,並將你手裡的 s2 位工兵全部派往 兵營 p2,使得雙方氣勢差距盡可能小。
注意
你手中的工兵落在哪個兵營,就和該兵營中其他工兵有相同的勢力歸屬(如果落在 m 號兵營,則不屬於任何勢力)。
輸入格式
輸入檔案的第一行包含乙個正整數n,代表兵營的數量。
接下來的一行包含 n 個正整數,相鄰兩數之間以乙個空格分隔,第 i個正整數代 表編號為 i 的兵營中起始時的工兵數量 ci 。
接下來的一行包含四個正整數,相鄰兩數間以乙個空格分隔,分別代表 m,p1,s1,s2
輸出格式
輸出檔案有一行,包含乙個正整數,即 p2,表示你選擇的兵營編號。如果存在多個編號同時滿足最優,取最小的編號。
樣例
例1輸入6
2 3 2 3 2 3
4 6 5 2輸出2
例2輸入6
1 1 1 1 1 16
5 4 1 1輸出1
—————————————————————————
【資料規模與約定】
1說明/提示
m:為分界的兵營號
p1:系統降兵兵營號
s1:系統降兵數
s2:可操控兵數
【輸入輸出樣例 1 說明】
見問題描述中的圖 2。
雙方以 m=4號兵營分界,有 s1=5位工兵突然出現在 p1=6號兵營。
龍方的氣勢為:
2×(4−1)+3×(4−2)+2×(4−3)=14
虎方的氣勢為:
2×(5−4)+(3+5)×(6−4)=18
當你將手中的 s2=2 位工兵派往 p2 =1 號兵營時,龍方的氣勢變為:
14+2×(4−2)=18
此時雙方氣勢相等。
【輸入輸出樣例 2 說明】
雙方以 m=5 號兵營分界,有 s1 = 1位工兵突然出現在 p1 = 4 號兵營。
龍方的氣勢為:
1×(5−1)+1×(5−2)+1×(5−3)+(1+1)×(5−4)=11
虎方的氣勢為:
16×(6−5)=16
當你將手中的 s2=1 位工兵派往 p2 = 1號兵營時
龍方的氣勢變為:
11+1×(5−1)=15
此時可以使雙方氣勢的差距最小。
—————————————————————————
解析
首先,輸入是很簡單的
int n;
typedef long long ll;
ll c[100005];
ll m,p1,s1,s2;
cin>>n;
for(int i=1;i<=n;i++)
cin>>m>>p1>>s1>>s2;
因為有系統降兵,所以我們先加上系統所降的兵,在分別計算龍氣,虎氣。
c[p1]+=s1;
現在,終於到了計算的時候 \(** ^ **)/
乙個兵營的氣勢為:該兵營中的工兵數× 該兵營到 m 號兵營的距離
ll ql=0,qh=0;
for(int i=1;i<=n;i++)else if(i>m)
}我們來看看龍,虎兩氣現有差值
ll mins=fabs(ql-qh);
這裡的「fabs」函式用於求絕對值(記得加標頭檔案「# include < cmath >」)
—————————————————————————
主要步驟
將我們要調配的小兵一 一調配至各兵營,調配後再比較前後差值絕對值的大小,將差值絕對值小的所調配的兵營號記錄下來
ll p2=m;
for(int i=1;i<=n;i++)else if(i>m)
if(fabs(newl-newh)
mins=fabs(newl-newh);
p2=i;
}最後,輸出一下差值最小所調配兵營號即可
cout<
—————————————————————————
最後,將全部**奉上
#include
#include
using namespace std;
int n;
typedef long long ll;
ll c[100005];
ll m,p1,s1,s2;
int main()
cin>>m>>p1>>s1>>s2;
c[p1]+=s1;
ll ql=0,qh=0;
for(int i=1;i<=n;i++)else if(i>m)
}ll mins=fabs(ql-qh);
ll p2=m;
for(int i=1;i<=n;i++)else if(i>m)
if(fabs(newl-newh)
mins=fabs(newl-newh);
p2=i;}}
cout<
return 0;
}—————————————————————————
加油↖(^ ω ^)↗
題解 P5016 龍虎鬥
首先祝各位大佬noip有個好成績吧 當時比賽有個大資料,蒟蒻我暴力居然過了,好激動 這題一定要注意開long long 那個大資料就是我開long long才過的 還有剛開始應設定答案為m 見解析 include includeusing namespace std long long f1,f2,...
P5016 龍虎鬥 高精度 快速讀取
軒軒和凱凱正在玩一款叫 龍虎鬥 的遊戲,遊戲的棋盤是一條線段,線段上有 nn 個兵營 自左至右編號 1 sim n1 n 相鄰編號的兵營之間相隔 11 厘公尺,即棋盤為長度為 n 1n 1 厘公尺的線段。ii 號兵營裡有 c ici 位工兵。下面圖 1 為 n 6n 6 的示例 軒軒在左側,代表 龍...
NOIP2018普及T2暨洛谷P5016 龍虎鬥
這是一道模擬題。看到題目,我們首先要把它細緻的讀明白,模擬題特別考察細節,往往會有想不到的坑點 好吧,這題貌似沒有 然後我們還要看一看資料範圍,可以注意到會出現10 9級別的數字。稍有資訊學常識的人都知道,int型儲存的最大數字是2147483647 再加就爆富負了 實在背不過這個數字也沒關係,只要...