Codeforces Round #503 (by SIS, Div. 2) ABC總結

首先,我我的以爲這套題比較爛。。。除了題幹長之外,題目也是有一點噁心。而後重回綠名。c++

A:給你n個相鄰的建築(從左到右編號1到n),每一個建築有h層,每一個建築的a層到b層中任意一層c層能夠花一秒直接到隔壁建築的c層。上下樓1層須要1秒。求q次查詢(建築a,層a)到(建築b,層b)的最短期。惟一的坑點就是同一層樓要特判。(然而我仍是WA了一發)spa

B:老師要問一個同窗a,這我的會說另外一個b,而後老師會批評b,而後b會說同窗c,老師再去批評c,依次下去,直到有一我的被批評了兩次。求老師問同窗1~n時,第一次被批評兩次的這我的。直接爆搜就能夠。。。感受比第一題還簡單。。。.net

C:n個選民,m個競爭者(編號1~m),你是1號競爭者。給出每一個選民準備選的競爭者,和讓這個選民選你的花費。求最小的花費讓你勝出(勝出就是你的票數大於其餘任何競爭者的票數)。剛開始準備各類模擬,而後樣例都過不了。。。比賽的時候幹了一個半小時沒幹出來。其實方向想錯了。應該枚舉答案而不是直接模擬過程。由於總有一個得票數i(1<=i<=n),讓你勝出。而後枚舉每一個i,把得票數大於等於i的競爭者中選他們的選民買通給本身投票,直到他的得票數小於i,而後再看本身票數是否可以達到i,不夠補一下。最後能達到就取一下最小費用。code

代碼:get

#include<bits/stdc++.h>
using namespace std;
const int N=3007;
typedef long long ll;
int n,m,i,j,k;
ll ans=1e18,v,cnt;
priority_queue<int,vector<int>,greater<int> >e[N],s[N],S;
int main(){
	for(scanf("%d%d",&n,&m),i=1;i<=n;++i)
	scanf("%d%d",&j,&k),s[j].push(k);
	for(i=1;i<=n;++i){
		while(!S.empty())S.pop();
		cnt=s[1].size();
		for(j=2;j<=m;++j)e[j]=s[j];
		for(v=0,j=2;j<=m;++j)
		while(e[j].size()>=i)
		v+=e[j].top(),e[j].pop(),cnt++;
		for(j=2;j<=m;++j)
		while(!e[j].empty())S.push(e[j].top()),e[j].pop();
		for(;cnt<i&&!S.empty();++cnt)v+=S.top(),S.pop();
		if(cnt>=i)ans=min(ans,v);
	}
	printf("%I64d\n",ans);
}

 

本文分享 CSDN - LSD20164388。
若有侵權,請聯繫 support@oschina.cn 刪除。
本文參與「OSC源創計劃」,歡迎正在閱讀的你也加入,一塊兒分享。it

相關文章
相關標籤/搜索