1. 程式人生 > >2017上海金馬五校 購買裝備 貪心+二分Check

2017上海金馬五校 購買裝備 貪心+二分Check

購買裝備

釋出時間: 2017年7月9日 18:17   最後更新: 2017年7月9日 21:05   時間限制: 1000ms   記憶體限制: 128M

最近盛大的一款遊戲傳奇世界極其火爆。遊戲玩家John,想購買遊戲中的裝備。已知遊戲的商店裡有n件裝備,第i件裝備具有屬性值ai,購買需要花費bi個金幣。John想去購買這些裝備,但是賬號中只有m個金幣,John是個很貪婪的傢伙,他想購買儘可能多的裝備。並且在保證購買到最多件裝備的情況下,他還想讓他所購買的裝備當中擁有最小屬性值的裝備屬性值儘可能大

輸入測試組數T,每組資料第一行輸入整數n(1<=n<=100000)和m

(1<=m<=109), 接下來有n行,第i行有兩個數aibi(1<=ai,bi<=10000).

對於每組資料,輸出兩個數字,第一個數字代表John最多可以購買的裝備數,第二個數代表在John購買最多件裝備的前提下,所購買的裝備當中擁有最小屬性值的裝備的最大屬性值(輸入資料保證至少可以購買一件裝備)

1
2 4
3 2
2 3
1 3

題解:

注意最後加粗的一句話“最小屬性值的裝備的屬性值儘可能大”,最大化最小值問題,非常典型的二分Check問題。

這個問題,我們要輸出最多能購買的裝備的數量,然後再這個基礎上再最大化最小值

對於求最多能購買的裝備的數量問題,毫無疑問是一個非常簡單的貪心問題。

我們先預處理按照價值排個序,然後貪心選取價值最小的裝備,得到最多的裝備數量記為max_num

然後,我們對屬性值進行二分Check,Check函式描述如下(原陣列已按照價值作為關鍵字排序):

對於裝備陣列,從前往後掃描,對於所有滿足條件(價值小於等於剩餘錢數   且   屬性值大於等於被check值)的裝備進行選取

判斷所選取的裝備數能否達到max_num

AC程式碼:

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
typedef pair<int,int> pii;
pii ps[100007]; 
int n,m;
bool check(int mid,int min_num){
	int res = 0;
	int remain = m;
	for(int i = 0;i < n;i++){
		if(remain >= ps[i].first && ps[i].second >= mid){
			remain -= ps[i].first;
			res++;
		}
	}
	return res >= min_num;
}
int main(){
	int T;
	scanf("%d",&T);
	while(T--){
		int INF = 0;
		int max_num = 0;
		scanf("%d%d",&n,&m);
		for(int i = 0;i < n;i++){
			int a,b;
			scanf("%d%d",&a,&b);
			ps[i] = make_pair(b,a);
			INF = max(INF,b);
		}
		sort(ps,ps+n);
		int remain = m;
		for(int i = 0;i < n;i++){
			remain -= ps[i].first;
			if(remain < 0){
				max_num = i;
				break;
			}
		}
		if(!max_num) min_num = n;
		int l = 0,r = INF + 1;
		while(r - l > 1){
			int mid = (l + r) / 2;
			if(check(mid,min_num)) l = mid;
			else r = mid;
		}
		printf("%d %d\n",max_num,l);
	}
	return 0;
}
/*
1
2 4
3 2
2 3

1
4 4
2 1 
2 2
2 3
2 4
*/


相關推薦

2017上海 購買裝備 貪心+二分Check

購買裝備 釋出時間: 2017年7月9日 18:17   最後更新: 2017年7月9日 21:05   時間限制: 1000ms   記憶體限制: 128M 描述 最近盛大的一款遊戲傳奇世界極其火爆。遊戲玩家John,想購買遊戲中的裝備。已知遊戲的商店裡有n件

2017上海程式設計競賽 C :Count the Number

Time Limit: 3 s Description Given n numbers, your task is to insert '+' or '-' in front of each number to construct expressions. Not

2017上海程式設計競賽 B:Sailing

Time Limit: 1 s Description Handoku is sailing on a lake at the North Pole. The lake can be considered as a two-dimensional square plan

2017上海程式設計競賽 E:Find Palindrome

Time Limit: 1 s Description Given a string S, which consists of lowercase characters, you need to find the longest palindromic sub-

2017上海程序設計競賽

ear lld iter style double top != -1 bre A STEED 這個字符串可以任意變換位子 找到第n個 深搜 遍歷所有可能字符串 然後放到set維護 第n個就可以了 #include<stdio.h> #include&l

2017上海程式設計競賽:Problem A : STEED Cards

Time Limit: 1 s Description Corn does not participate the STEED contest, but he is interested in the word "STEED". So, Corn writes all permutations of t

2017上海程式設計競賽:Find Palindrome

Description Given a string S, which consists of lowercase characters, you need to find the longest palindromic sub-string. A sub-string

2017上海程式設計競賽(網上資格賽)J : Raising Bacteria

Time Limit: 1 s Description You are a lover of bacteria so you want to raise some bacteria in a box. Initially, the box is empty. Every morning, you can

2017上海程式設計競賽 Problem C : Count the Number

Problem C : Count the Number Time Limit: 3 s Description Given n numbers, your task is to insert ‘+’ or ‘-’ in front of each num

2017Summmer_上海 F題,G題,I題,K題

sum 組隊 時序 而且 sizeof bit 屬性排序 print 浪費 以下題目均自己搜 F題 A序列 一開始真的沒懂題目什麽意思,還以為是要連續的子串,結果發現時序列,簡直智障,知道題意之後,好久沒搞LIS,有點忘了,復習一波以後,直接雙向LIS,處理處兩個數組L和

2018年上海程式設計競賽 Problem O : ±1 Matrix

Time Limit: 5 sDescriptionA matrix in mathematics is a rectangular array of numbers arranged in rows and columns. Given an n×m matrix A and an m×k matrix B

2018年上海程式設計競賽 E題

題目DescriptionHere is an n×m grid, which is made up of 1×1 lattices. You can find many rectangles with different sizes in the grid. Can you

“盛大遊戲杯”第15屆上海大學程序設計聯賽夏季賽暨上海高校賽 C

一行 spa sizeof 聯賽 sin pre row span -s 時間過得好快啊,SHU計算機學院又有新的一批小朋友們進來了。2016級的同學想必也是非常喜歡計算機學院的,於是院長想測試一下大家對計算機的喜愛程度(院長大人別查我水表)。 院長給大家一行由大寫字母

“盛大遊戲杯”第15屆上海大學程序設計聯賽夏季賽暨上海高校賽 I

mat tail for 我們 大學 一行 ace 一個 ostream 有一天,空和白很無聊,決定玩盛大遊戲,考慮到兩個人玩,他們隨便掏了一個遊戲出來:在一個n?m 的棋盤上,首先把史蒂芬妮·多拉放在左上角(1,1) 的位置。每次一個人可以將她往下,往右,往右下丟

“盛大遊戲杯”第15屆上海大學程序設計聯賽夏季賽暨上海高校賽 G

class ati text sin 生命力 但是 %d nod cti 最近,盛大計劃開發一款手遊,以下是簡化版。系統和我方各有n 頭怪獸,每一頭怪獸都有生命值和攻擊力,並且當怪獸A攻擊怪獸B,如果怪獸B的生命值高於怪獸A的攻擊力,則怪獸B的生命力減少A的攻擊力的數

“盛大遊戲杯”第15屆上海大學程序設計聯賽夏季賽暨上海高校賽 F

con text mes namespace view spa label 子序列 cti 如果一個序列有奇數個正整數組成,不妨令此序列為a 1 ,a 2 ,a 3 ,...,a 2?k+1 (0<=k ),並且a 1 ,a 2 ...a k+1 是一個

2018上海高校賽訓練日誌

ont target 水題 href 校賽 隊列 正數 distance com solve 5(A E F I L) rank 77 水題總體沒有很卡,但提升的題都沒有思路,實力差距還是有的。 個人感覺出了的題都是銅牌及以下的難度。 A Was

埃森哲杯第十六屆上海大學程序設計聯賽春季賽暨上海高校賽 C序列變換

整數 sub target OS Go space != while opened 鏈接:https://www.nowcoder.com/acm/contest/91/C來源:牛客網沒有賬號的同學這樣註冊,支持博主 題目描述 給定兩個長度為n的序列,ai, b

第十六屆上海大學程式設計聯賽春季賽暨上海高校賽 題解

【題目連結】 模擬。從左往右填充每一個,如果某一個格子不足,需要從右邊離他最近的有盈餘的格子裡拿一些來填充;如果某一個格子有盈餘,那麼多餘部分往右扔過去。 /******************************* Judge Result : AC ***********

“盛大遊戲杯”第15屆上海大學程式設計聯賽夏季賽暨上海高校賽-神無月排位賽

《神無月》作為盛大遊戲2017年的全新原創大作,其開發團隊在自研實力強大的傳世工作室基礎之上,還有美樹本晴彥等日本一線知名畫師及日本遊戲音樂大師崎元仁加盟參與制作。目前正在不限號內測中,有很多玩家進入到神無月的世界中。 在神無月中,有著玩家之間切磋的排位賽,其段位主要分為五大段位,從低到高依次為:新兵、菁英