sdnu山东省ACM 2010年第一届省赛Greatest Number

2024-02-21 00:58

本文主要是介绍sdnu山东省ACM 2010年第一届省赛Greatest Number,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

原题链接:http://210.44.14.31/problem/show/1141


注意事项:

范围太大,爆搜超时。


本人猜测,本题的测试数据可能均是需要四个数才能的出最优解(依据第二个代码)。


具体分析看代码。

代码如下:

#include<iostream>
#include<algorithm>
#include<cstdio>			//别用cin,本题测试数据较多
using namespace std;
int num[1000000 + 10];
int main()
{int n, m;int k = 0;	while (scanf_s("%d%d",&n,&m)&&(n||m)){num[0] = 0;int max = 0;for (int i = 1; i <= n; i++){scanf_s("%d", &num[i]);if (num[i]>m)			//超范围的直接去除{n--;i--;continue;}}												//此时num数组里有 1到n 个单个的值int cnt = n+1;cout << "Case " << ++k << ": ";for (int i = 1; i <= n; i++)for (int j = i; j <= n; j++)if (num[i] + num[j]<=m)num[cnt++] = num[i] + num[j];			//此时前n个位单个值,n+1到cnt为不大于m的所有两个值的和sort(num, num + cnt);int left, right=cnt-1,nextright=cnt-1;for (int i = 0; i < cnt; i++)				//因为数组里有单个值也有两个值的和  所以会出现 两个值的和、三个值的和、四个值的和{left = i;while (left <= right){int mid = (left + right) >> 1;int tempmax = num[i] + num[mid];if ( tempmax< m){left = mid + 1;if ( tempmax> max){max = tempmax;nextright = mid;		//关键:在已经排好序的数组里,从i到i+1    i对应的mid必定在i+1对应的mid  的右边即mid(i)>=mid(i+1)这样做可以提高效率}}else if (tempmax>m)right = mid - 1;else				//找到直接结束循环{max = m;i = cnt;break;}}right = nextright;		//将right减小}cout << max << endl<<endl;}return 0;
}

附另解(本解法只用了四个数的组合便可ac,代码简单就不做详解了):

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;int str[1000010],op[1010];
int main()
{int i,j,k,n,m,ans,t=1;bool flag=false;while(~scanf("%d%d",&n,&m),n||m){op[0] = k = 0;for(i=1;i<=n;i++)scanf("%d",&op[i]);sort(op,op+n+1);for(i=0;i<=n;i++)for(j=i;j<=n;j++){if(op[i]+op[j]<=m)str[k++] = op[i]+op[j];}sort(str,str+k);ans = 0;for(i=0;i<k;i++){int low=i,high=k-1;while(low<high){int mid=(low+high)/2;if(str[i]+str[mid]>m)high = mid-1;elselow = mid+1;}if(str[i]+str[low]>ans && str[i]+str[low]<=m)ans = str[i]+str[low];}if(flag)printf("\n");printf("Case %d: %d\n",t++,ans);flag = true;}return 0;
}



这篇关于sdnu山东省ACM 2010年第一届省赛Greatest Number的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/730103

相关文章

认识、理解、分类——acm之搜索

普通搜索方法有两种:1、广度优先搜索;2、深度优先搜索; 更多搜索方法: 3、双向广度优先搜索; 4、启发式搜索(包括A*算法等); 搜索通常会用到的知识点:状态压缩(位压缩,利用hash思想压缩)。

usaco 1.2 Name That Number(数字字母转化)

巧妙的利用code[b[0]-'A'] 将字符ABC...Z转换为数字 需要注意的是重新开一个数组 c [ ] 存储字符串 应人为的在末尾附上 ‘ \ 0 ’ 详见代码: /*ID: who jayLANG: C++TASK: namenum*/#include<stdio.h>#include<string.h>int main(){FILE *fin = fopen (

题目1380:lucky number

题目1380:lucky number 时间限制:3 秒 内存限制:3 兆 特殊判题:否 提交:2839 解决:300 题目描述: 每个人有自己的lucky number,小A也一样。不过他的lucky number定义不一样。他认为一个序列中某些数出现的次数为n的话,都是他的lucky number。但是,现在这个序列很大,他无法快速找到所有lucky number。既然

Jenkins 通过 Version Number Plugin 自动生成和管理构建的版本号

步骤 1:安装 Version Number Plugin 登录 Jenkins 的管理界面。进入 “Manage Jenkins” -> “Manage Plugins”。在 “Available” 选项卡中搜索 “Version Number Plugin”。选中并安装插件,完成后可能需要重启 Jenkins。 步骤 2:配置版本号生成 打开项目配置页面。在下方找到 “Build Env

【转载】ACM感悟

今天看了一篇我们学校前辈的ACM的感悟,觉得写的十分有道理,这里转载,文章还会不断的改进和更新。 原文链接:http://www.cnblogs.com/Chierush/p/3760870.html?ADUIN=1339764596&ADSESSION=1401536826&ADTAG=CLIENT.QQ.5329_.0&ADPUBNO=26349 声明:本文是写给弱校ACM新手的一点

【Hdu】Minimum Inversion Number(逆序,线段树)

利用线段树在nlogn的时间复杂度内求一段数的逆序。 由于给的序列是由0 ~ n -1组成的,求出初始的逆序之后可以递推出移动之后的逆序数。 #include<cstdio>#include<iostream>#include<cstring>#include<algorithm>using namespace std;typedef long long LL;const in

我们依旧在追梦的路上-山东省第六届ACM比赛总结

这场比赛从结果而言达到了预期(金牌),从过程而言和我的预期相差甚远(打的太乱,个人发挥很差),还好关键时刻队友抗住压力,负责后果真的不堪设想。 热身赛 热身赛纯粹测机器的,先把A,B,C草草水过(A题小写x打成大写的也是醉了),我和老高开始各种测机器,long long不出所料是lld的,试了一下除0和数组越界的re问题,发现没有re,只有wa(甚至数组越界还AC了),至于栈深的话也没过多追

【JavaScript】基本数据类型与引用数据类型区别(及为什么String、Boolean、Number基本数据类型会有属性和方法?)

基本数据类型   JavaScript基本数据类型包括:undefined、null、number、boolean、string。基本数据类型是按值访问的,就是说我们可以操作保存在变量中的实际的值。 1)基本数据类型的值是不可变的 任何方法都无法改变一个基本类型的值,比如一个字符串: var name = "change";name.substr();//hangconsole.log

ACM东北地区程序设计大赛

不得不说随着参赛级别的提高,题目真的是越来越难啊,不过队长真是给力啊,在我们三个共同努力之下拿下了地区赛三等奖,哈哈我们可是大一唯一一只获奖队,终于在这次比赛打败了田大神。。。大神是失手了,俺和他差距还是挺大的。。。队友陈彤马上要去服兵役了,他说这是我们送给他最好的离别礼物,希望那家伙在部队好好干,以后谁干揍我!!!东北地区赛结束后,今年已经估计没机会参加亚洲区比赛了,赶紧补高数和线数啊!!别挂了

ACM比赛中如何加速c++的输入输出?如何使cin速度与scanf速度相当?什么是最快的输入输出方法?

在竞赛中,遇到大数据时,往往读文件成了程序运行速度的瓶颈,需要更快的读取方式。相信几乎所有的C++学习者都在cin机器缓慢的速度上栽过跟头,于是从此以后发誓不用cin读数据。还有人说Pascal的read语句的速度是C/C++中scanf比不上的,C++选手只能干着急。难道C++真的低Pascal一等吗?答案是不言而喻的。一个进阶的方法是把数据一下子读进来,然后再转化字符串,这种方法传说中