ytuOj3290Taro's Shopping

问题 J: Taro’s Shopping

时间限制: 1 Sec 内存限制: 128 MB
提交: 118 解决: 46
[提交][状态][讨论版][命题人:acm4302]
题目描述
Mammy决定给Taro带来他的第一次购物体验。Mammy告诉他从购物目录中列出的那些中选择他想要的任何两件物品,但是Taro无法决定哪两件,因为所有物品看起来都很吸引人。因此,他计划购买价值最高的两件物品,不超过Mammy允许的金额。由于获得两个相同的物品很无聊,他想要两个不同的物品。
你被要求帮助Taro选择这两个物品。给出了所有物品的价目表。在列表中的两个物品对中,找到最高价格总和不超过允许金额的对,并打印总和。买两件,不是一件,也不是三件,也不是更多。请注意,列表中的两个或多个物品的定价可能相同。
输入
输入由多个数据集组成,每个数据集采用以下格式。
n m
a1 a2 … an
数据由两行组成。在第一行中,给出了物品数n和允许的最大支付额m.n 是2≤n≤1000的整数.m是满足2≤m≤2,000,000的整数。在第二行中,给出了n个物品的价格。ai(1≤i≤n)是第i个物品的价格。该值是大于或等于1且小于或等于1,000,000的整数。
输入的结尾由包含两个零的行指示。所有数据集的n的总和不超过50,000。

输出
对于每个数据集,找到最高价格总和不超过允许量m的两件物品,并在一行中输出总和。如果每对项目的价格总和都超过m,则输出NONE。
样例输入
3 45
10 20 30
6 10
1 2 5 8 9 11
7 100
11 34 83 47 59 29 70
4 100
80 70 60 50
4 20
10 5 10 16
0 0
样例输出
40
10
99
NONE
20
[提交][状态]

代码可能有点冗杂,欢迎在下面留言,我会解释解释,欢迎各位大佬批评指正

#include<iostream>
#include<algorithm>
#include<stdlib.h>
using namespace std;
int main()
{
    int n,m,i;
    while(cin>>n>>m&&m&&n)
    {
        int value[n];
        for(i=0;i<n;i++)
            cin>>value[i];
        sort(value,value+n);
        int j,sum,cont,temp,ans=0;
        if(value[0]+value[1]>m)
            cout<<"NONE"<<endl;
        else
        {
        for(i=n-1;i>=0;i--)
        {
            cont=0,sum=0,temp=m;
                if(value[i]<temp)
                {
                    sum+=value[i];
                    temp-=value[i];
                    cont++;
                    for(j=i-1;j>=0;j--)
                    {
                        if(value[j]<=temp)
                        {
                            sum+=value[j];
                            cont++;
                        }
                        if(cont==2)
                            break;
                    }
                    if(cont==1)
                        continue;
                    else
                        if(sum>ans)
                        ans=sum;
                }
        }
        cout<<ans<<endl;
        }
    }
    return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值