uva10487-最接近的和

题目链接 http://acm.hust.edu.cn/vjudge/problem/21350

解题思路

先排序。

对于每个数,找到另外两个数,使得与其中一个加起来小于目标与另外一个加起来大于目标。

如果找不到可能是只能选头两个或末尾两个。

再求绝对值那个更小就行了。

代码

#include<stdio.h>
#include<algorithm>
#define MAX_NUM 1<<31-1
using namespace std;
const int maxLen = 1005;
int data[maxLen];
int targer[26];
int ans[26];
int minv;
int Judge(int i, int n, int t)
{
    int pre = -1;
    for(int k=i+1; k<n-1; k++)
        if(data[k]+data[i]<t && data[k+1]+data[i]>=t) pre=k;
    if(pre==-1) {
        if(data[i]+data[n-1]<t) {
            if(abs(data[i]+data[n-1]-t)<minv) {
                   minv = abs(data[i]+data[n-1]-t);
                return data[i]+data[n-1];
            }
            else return MAX_NUM;
        }
        else if(data[i]+data[i+1]>=t) {
            if(abs(data[i]+data[i+1]-t)<minv) {
                minv = abs(data[i]+data[i+1]-t);
                return data[i]+data[i+1];
            }
            else return MAX_NUM;
        }
    }
    else if(abs(data[i]+data[pre]-t)<abs(data[i]+data[pre+1]-t)) {
            if(minv>abs(data[i]+data[pre]-t))
                { minv = abs(data[i]+data[pre]-t); return data[i]+data[pre]; }
            else return MAX_NUM;
        }
        else
            if(minv>abs(data[i]+data[pre+1]-t))
                { minv = abs(data[i]+data[pre+1]-t); return data[i]+data[pre+1]; }
            else return MAX_NUM;
}
int main()
{
    int n, cases = 1;
    scanf("%d", &n);
    while(n != 0) {
        for(int i=0; i<n; i++) scanf("%d", &data[i]);
        sort(data, data+n);
        int m;
        scanf("%d", &m);
        for(int i=0; i<m; i++) {
            scanf("%d", &targer[i]);
            minv = MAX_NUM;
            for(int j=0; j<n-1; j++) {
                int a = Judge(j,n,targer[i]);
                if(a != MAX_NUM)
                    ans[i] = a;
            }
        }
        printf("Case %d:\n", cases);
        for(int i=0; i<m; i++)
            printf("Closest sum to %d is %d.\n", targer[i], ans[i]);
        cases++; scanf("%d", &n);
    }
    return 0;
}
时间: 2024-09-29 02:38:10

uva10487-最接近的和的相关文章

uva10487

#include<iostream> #include<algorithm> using namespace std; int n,m,k,cases,sum,arr[1005],S[1000000]; void calsum(){ k=0; for (int i=0;i<n-1;i++){ for (int j=i+1;j<n;j++){ S[k++]=arr[i]+arr[j]; } } sort(S,S+k); } int abs(int t){ return t

UVA10487 Closest Sums【暴力+二分】

Given is a set of integers and then a sequence of queries. A query gives you a number and asks to find a sum of two distinct numbers from the set, which is closest to the query number. Input Input contains multiple cases. ????Each case starts with an

luogu P1774 最接近神的人_NOI导刊2010提高(02)

题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着"神的殿堂".小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门-- 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即交换序列中相邻的两个元素.而用最少的交换次数使原

输入一个整数,判断其是否是2^n,是就输出这个数,不是就输出和它最接近的为2^n的那个整数。

输入一个整数,判断其是否是2^n,若是,输出这 //个数,若不是,输出和它最接近的为2^n的那个整数. 附加源代码1: #include<stdio.h> #include<stdlib.h> #include<math.h> int main() { int input;//键盘输入一个整数input int i,j;//i,j待会儿存放input与左边和右边的为2^n的差值 int m,n;//保存左边,右边的与inout最接近的2^n printf("请

luoguP1774 最接近神的人_NOI导刊2010提高(02)x

P1774 最接近神的人_NOI导刊2010提高(02) 题目描述 破解了符文之语,小FF开启了通往地下的道路.当他走到最底层时,发现正前方有一扇巨石门,门上雕刻着一幅古代人进行某种活动的图案.而石门上方用古代文写着“神的殿堂”.小FF猜想里面应该就有王室的遗产了.但现在的问题是如何打开这扇门…… 仔细研究后,他发现门上的图案大概是说:古代人认为只有智者才是最容易接近神明的.而最聪明的人往往通过一种仪式选拔出来.仪式大概是指,即将隐退的智者为他的候选人写下一串无序的数字,并让他们进行一种操作,即

算法学习(3)----求数组中大小最接近的两个元素的差

<算法设计与分析基础>习题1.2 第 9 题如下: 考虑下面这个算法,它求的是数值数组中大小最接近的两个元素的差. 算法: MinDistance(A[0..n-1]) //输入:数字数组 A[0..n-1] //输出:数组中两个大小相差最少的元素的差值 dmin <- ∞ for i <- 0 to n-1 do for j <- 0 to n-1 do if i≠j and |A[[i]-A[j]| < dmin dmin <- |A[i]-A[j]| ret

iOS 9 时代,iOS 7 占比接近 10% 该何去何从?

iOS 9 时代.iOS 7 占比接近 10% 该何去何从? 太阳火神的漂亮人生 (http://blog.csdn.net/opengl_es) 本文遵循"署名-非商业用途-保持一致"创作公用协议 转载请保留此句:太阳火神的漂亮人生 -  本博客专注于 敏捷开发及移动和物联设备研究:iOS.Android.Html5.Arduino.pcDuino,否则.出自本博客的文章拒绝转载或再转载,谢谢合作. 苹果应用商店 2015 年 11 月 30 日监測结果: 马克思告诉我们,运动是绝对

子数组和最接近零问题

子数组和最接近零问题: 对于长度为N的数组A,求连续子数组的和最接近0的值. 如:1,-2,3,10,-4,7,2,-5:该数组中子数组和最接近零的值为0,子数组为-4,7,2,-5. 程序实现: 1 /*************************************** 2 FileName NearZeroSubArray.cpp 3 Author : godfrey 4 CreatedTime : 2016/5/3 5 ******************************

最接近点对问题

题目大意,给出平面上n个点,每个点都有自己的坐标,找其中一对点,在其中是最短的距离 每一点个n-1个点算出距离,这方法太SB了,换一个 然后就考虑两个子集,S1和S2,分别大约有N/2个点,使得在n个点组成的所有点对中,然后在每一个子集集中递归来解决这问题.问题就是两点如果恰好分别在S1和S2,怎么办? 这里直接给出代码: bool Cpairl(S,d) { n=|S|; if(n<2){d=无限大梦想;return false} m=S的中位数; S1={x|x<=m}; S2={x|x&

Java从一组数组中找出最接近目标值的值

两种算法: 1.原始数据是乱序的 2.原始数据是有序的 1. 1 package test; 2 3 import java.io.File; 4 5 public class Test { 6 /** 7 * 假设原始数据是乱序 8 */ 9 static int[] src = new int[] { 25, 68, 5, 38, 2, 15, 90, 55, 46 }; 10 /** 11 * 目标值 12 */ 13 static int x = 555; 14 15 public st