20200226(ABC)

C - Photographer

题目:

Valera’s lifelong ambition was to be a photographer, so he bought a new camera. Every day he got more and more clients asking for photos, and one day Valera needed a program that would determine the maximum number of people he can serve.

The camera’s memory is d megabytes. Valera’s camera can take photos of high and low quality. One low quality photo takes a megabytes of memory, one high quality photo take b megabytes of memory. For unknown reasons, each client asks him to make several low quality photos and several high quality photos. More formally, the i-th client asks to make xi low quality photos and yi high quality photos.

Valera wants to serve as many clients per day as possible, provided that they will be pleased with his work. To please the i-th client, Valera needs to give him everything he wants, that is, to make xi low quality photos and yi high quality photos. To make one low quality photo, the camera must have at least a megabytes of free memory space. Similarly, to make one high quality photo, the camera must have at least b megabytes of free memory space. Initially the camera’s memory is empty. Valera also does not delete photos from the camera so that the camera’s memory gradually fills up.

Calculate the maximum number of clients Valera can successfully serve and print the numbers of these clients.
Input

The first line contains two integers n and d (1 ≤ n ≤ 105, 1 ≤ d ≤ 109) — the number of clients and the camera memory size, correspondingly. The second line contains two integers a and b (1 ≤ a ≤ b ≤ 104) — the size of one low quality photo and of one high quality photo, correspondingly.

Next n lines describe the clients. The i-th line contains two integers xi and yi (0 ≤ xi, yi ≤ 105) — the number of low quality photos and high quality photos the i-th client wants, correspondingly.

All numbers on all lines are separated by single spaces.
Output

On the first line print the answer to the problem — the maximum number of clients that Valera can successfully serve. Print on the second line the numbers of the client in any order. All numbers must be distinct. If there are multiple answers, print any of them. The clients are numbered starting with 1 in the order in which they are defined in the input data.
Examples
Input

3 10
2 3
1 4
2 1
1 0

Output

2
3 2

加粗样式 Input

3 6
6 6
1 1
1 0
1 0

Output

1
2



题意:
有高质量,低质量的照片两种,两者都会占用一定内存,而相机有内存限制。客户会需要这两种照片数量若干,问最多能满足多少用户和分别是第几位用户。
思路:
定义结构体数组,使用sort对照片的总大小进行排序,然后累加判断是否会超出内存,输出最大的用户数量,依次输出用户的编号。(55555,一直提交都wronganswer,最后发现不止是data要用long long,而是这些数据都要用。最后就ac了,不过发现时间到了,就过了十来秒,不能提交了,蓝瘦香菇,T_T)
代码:

#include <iostream>
#include<cstring>
#include<algorithm>
using namespace std;

struct nom
{
    int num;
    int pos;
}man[10000005];
bool rule(nom a, nom b)
{
    return a.num < b.num;
}
int main(void)
{
    long long client, low, hig,data, a, b, sum = 0, count = 0;
    cin >> client >> data >> low >> hig;
    for (int i = 0; i < client; i++)
    {
        cin >> a >> b;
        man[i].num = a *low + b * hig, man[i].pos = i + 1;
    }
    sort(man, man + client, rule);
    for (int i = 0; i < client;i++ )
    {
        sum += man[i].num;
        if (sum <= data) 
            count++; 
        else
            break;
    }
    cout << count << endl;
    for (int i = 0; i < count; i++)
    {
        cout << man[i].pos << ' ';
    }       
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值