注:最近这一系列ACM的内容,都是2年多之前的代码,自己回顾一下。
SuperRock钟爱的香蕉
Submit: 1494
Accepted:943
Time Limit: 1000MS Memory Limit: 65536K
Description
Bupt的新水果店开张,有买一赠一的活动,即每买一只大小为A(1 <= A <= 1,000,000)的香蕉,他就能免费获得一只大小为B(1 <= B < A)的香蕉!
吝啬鬼SuperRock以及整个912实验室成员都喜欢香蕉,然而,这个活动是有规定的:大的一只香蕉必须是甜的,小的一只是不甜的。SuperRock并不在意:912里的都是狼,不管什么味道,香蕉总是一抢而光,他只想买最多的香蕉。
给出一组N(1 <= N <= 10,000)只甜香蕉的大小,M(1 <= M <= 10,000)只不甜的香蕉的大小,找出SuperRock最多能买多少只香蕉。注意:他能买甜的香蕉而不拿免费的不甜香蕉(店老板很高兴),但他不能直接买不甜的香蕉(就是说,他只能通过赠送来获得)。
神哪,救一救SuperRock,找一个办法尽可能的喂饱那些狼吧。
Input
第 1 行: 两个用空格分开的整数,N和M。
第 2 至 N+1 行: 第i+1行包含一个整数,是第i只甜香蕉的大小。
第 N+2 至 N+M+1 行: 第i+N+1行包含一个整数,是第i只不甜的香蕉的大小。
Output
第 1 行: SuperRock能买的最大的香蕉的只数。
Sample Input
3 4
6
1
3
1
5
3
4
Sample Output
5
Hint
显然,SuperRock能买所有的甜的香蕉。当他买了大小为6的甜香蕉,他可以免费拿任何一只不甜的香蕉(例如大小为3的)。当他买了大小为3的高质量香蕉,他可以拿大小为1的免费不甜的香蕉。然而当他买了大小为1的甜干草,就不能拿不了免费香蕉了(因为大小必须严格小于)。这样,尽管SuperRock很聪明,但他最多也只能拿5只香蕉了。
Source
moyuji@BUPT
甜的都要买,就看能送多少只。先按大小分别排序,从甜香蕉从大到小的遍历,同样地换一个能换的最大的不甜的香蕉。
#include <iostream>
using namespace std;
bool cmp(int a, int b) { return (a > b); }
int main ()
{
int N, M, Sweet[10000], NSweet[10000], count, pos, flag;
cin >> N >> M;
for (int i = 0; i < N; i++) { cin >> Sweet[i]; }
for (int i = 0; i < M; i++) { cin >> NSweet[i]; }
sort(Sweet, Sweet + N, cmp);
sort(NSweet, NSweet + M, cmp);
pos = 0;
count = N;
flag = 1;
for (int i = 0; i < N && flag; i++)
{
int j;
for (j = pos; NSweet[j] >= Sweet[i] && j < M; j++) {;}
if (j == M)
flag = 0;
else
{
pos = j + 1;
count += 1;
}
}
cout << count << endl;
// system("pause");
return 0;
}