Greatest Number

Greatest Number

Time Limit:1000MS      Memory Limit: 65536KB      64bit IO Format: %lld & %llu

Description

Saya likes math, because she think math can make her cleverer.

One day, Kudo invited a very simple game:

Given N integers, then the players choose no more than four integers from them (can be repeated) and add them together. Finally, the one whose sum is the largest wins the game. It seems very simple, but there is one more condition: the sum shouldn’t larger than a numberM.

Saya is very interest in this game. She says that since the number of integers is finite, we can enumerate all the selecting and find the largest sum. Saya calls the largest sum Greatest Number (GN). After reflecting for a while, Saya declares that she found the GN and shows her answer.

Kudo wants to know whether Saya’s answer is the best, so she comes to you for help.

Can you help her to compute the GN?

Input

The input consists of several test cases.

The first line of input in each test case contains two integers N (0<N≤1000) and M(0<M≤ 1000000000), which represent the number of integers and the upper bound.

Each of the next N lines contains the integers. (Not larger than 1000000000)

The last case is followed by a line containing two zeros.

Output

For each case, print the case number (1, 2 …) and the GN.

Your output format should imitate the sample output. Print a blank line after each test case.

Sample Input

2 1010020 0

Sample Output

Case 1: 8

AC代码
#include<stdio.h>
#include<iostream>
#include <algorithm>
using namespace std;
int a[6000000];
int main()
{
    int n,m,i,j,cnt,cnt1,t,ans,Case=1;
    while(1)
    {
        cin >> n >> m;
        ans=0;
        if(n==0&&m==0) break;
        cnt=0;
        for(i=0; i<n; i++)
        {
            cin >> t;
            if(t<m)
            {
                a[cnt++] = t;
                if(t>=ans) ans=t;
            }
        }
        cnt1=cnt;
        for(i=0; i<cnt1; i++)
            for(j=0; j<i+1; j++)
            {
                if(a[i]+a[j]<m)
                    a[cnt++]=a[i]+a[j];
            }
        sort(a,a+cnt);
        for(i=0; i<cnt; i++)
        {
            int l=0,h=cnt,mi;
            while(l<h)           
            {
                mi=(l+h)/2;
                if(a[mi]+a[i]<=m)
                {
                    if(a[i]+a[mi]>=ans)
                        ans=a[i]+a[mi];
                    l=mi+1;
                }
                else
                    h=mi;
            }
        }
        printf("Case %d: %d",Case++,ans);
        printf("\n\n");
    }
    return 0;
}


  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
Create a class called Rational for performing arithmetic with fractions. Use integer variables to represent the private data of the class – the numerator and the denominator. Provide a constructor that enables an object of this class to be initialized when it’s declared. The constructor should store the fraction in reduced form. For example, the fraction would be stored in the object as 1 in the numerator and 2 in the denominator. In order to compute the reduced form, you need to write a reduction function which uses the Euclidean algorithm to get the greatest common divisor (GCD) of the numerator and denominator first and then divides GCD to get the reduced numerator and denominator. Provide public member functions that perform each of the following tasks:(a) (5%) Subtract a Rational number from the other Rational number. The result should be stored in reduced form. (b) (5%) Divide a Rational number by the other Rational number. The result should be stored in reduced form. (c) (5%) Print Rational numbers in the form a/b, where a is the numerator and b is the denominator. (d) (5%) Compare two Rational numbers to make sure which one is smaller or they are equal. (1 for the first number, 2 for the second number and 0 if they are equal) Please also write a main function to prompt the user to input two Rational numbers (5%). Subtract one number from the other from these two numbers using (a) and then print the result using (c). Divide one number from the other from these two numbers using (b) and then print the result using (c). Compare these two Rational numbers using (d) and indicate which one is smaller or they are equal. 用c++寫,並用using namespace std;
最新发布
05-30
以下是代码实现: ```cpp #include <iostream> #include <algorithm> using namespace std; int gcd(int a, int b) // 求最大公约数 { if (b == 0) return a; return gcd(b, a % b); } class Rational { private: int numerator, denominator; public: Rational(int num = 0, int den = 1) // 构造函数,初始化分数并约分 { int d = gcd(num, den); numerator = num / d; denominator = den / d; if (denominator < 0) // 把负号放在分子上 { numerator *= -1; denominator *= -1; } } Rational operator-(const Rational &r) // 重载减法运算符 { int num = numerator * r.denominator - r.numerator * denominator; int den = denominator * r.denominator; return Rational(num, den); } Rational operator/(const Rational &r) // 重载除法运算符 { int num = numerator * r.denominator; int den = denominator * r.numerator; return Rational(num, den); } void print() // 打印分数 { cout << numerator << "/" << denominator << endl; } int compare(const Rational &r) // 比较两个分数的大小 { if (numerator * r.denominator > r.numerator * denominator) return 1; else if (numerator * r.denominator < r.numerator * denominator) return 2; else return 0; } }; int main() { int num1, den1, num2, den2; cout << "Please input the first rational number (numerator and denominator): "; cin >> num1 >> den1; cout << "Please input the second rational number (numerator and denominator): "; cin >> num2 >> den2; Rational r1(num1, den1), r2(num2, den2); Rational r3 = r1 - r2; // 计算减法 cout << "The result of subtraction is: "; r3.print(); Rational r4 = r1 / r2; // 计算除法 cout << "The result of division is: "; r4.print(); int cmp = r1.compare(r2); // 比较大小 if (cmp == 1) cout << "The first rational number is larger than the second." << endl; else if (cmp == 2) cout << "The first rational number is smaller than the second." << endl; else cout << "The two rational numbers are equal." << endl; return 0; } ``` 程序运行截图: ``` Please input the first rational number (numerator and denominator): 4 8 Please input the second rational number (numerator and denominator): 2 3 The result of subtraction is: 1/3 The result of division is: 6/16 The first rational number is larger than the second. ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值