标题:请大家指点指点关于程序超时问题
只看楼主
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
结帖率:75%
已结贴  问题点数:20 回复次数:20 
请大家指点指点关于程序超时问题
题目:
Time Limit: 1000MS
Description
 lyl想送给wjh三个礼物,他想送给wjh三个戒指。商场有n个戒指。每个戒指价值v_i。。wjh很挑剔她想要个总价值大于等于k的礼物,而且不要相同的戒指,请问lyl有多少方案送?

Input
(请用scanf读入)
第一行t表示t个样例,1<=t<=100
每个样例
 第一行有n和k  表示n个礼物 保证 1<=n<=1000 保证 0<=k<=10^16
 下一行有n个v_i用空格相隔。表示n个戒指的价值(注意有时不同戒指的价值一样)保证 1<=v_i<=10^15 不保证有序
Output
n行。每一行表示多少种方案。
Sample Input
5
8 5
1 1 1 2 3 4 5 6
4 7
1 2 3 4
2 0
1 1
8 4
1 1 1 1 1 1 1 1
8 3
1 1 1 1 1 1 1 1
Sample Output
52
3
0
0
56


应该是我的算法太差,求指点改改算法
程序代码:
# include <stdio.h>

int main (void)
{
    int t;
    int count;
    int i, j, k;
    int n; 
    long sum;
    long v[1000];
    int num = 0;

    scanf("%d", &t);

    for(count=0; count<t; count++)
    {
        scanf("%d %ld", &n, &sum);              //表示n个礼物,总价值大于sum

        for(i=0; i<n; i++)
        {
            scanf("%ld", &v[i]);      //戒指的价钱
        }

        if(n < 3)
        {
            num = 0;
            printf("%d\n", num);
        }

        else
        {
            num = 0;

            for(i=0; i<n; i++)
            {
                for(j=i+1; j<n; j++)
                {
                    for(k=j+1; k<n; k++)
                    {
                        if((v[i]+v[j]+v[k]) >= sum)
                        {
                            ++num;
                        }
                    }
                }
            }

            printf("%d\n", num);
        }
    }

    return 0;
}


[ 本帖最后由 岑吼吼 于 2014-5-14 15:56 编辑 ]
搜索更多相关主题的帖子: 礼物 戒指 价值 而且 
2014-05-14 15:55
pangshch
Rank: 10Rank: 10Rank: 10
等 级:青峰侠
威 望:2
帖 子:443
专家分:1966
注 册:2013-4-9
得分:0 
给你个建议, 不要去计算什么和,
只要计算方案, 那用 排列组合 的知识就可以了。
下班了, 等晚上回去了再给你具体的代码。这之前你可以自己试试。
2014-05-14 17:46
ditg
Rank: 10Rank: 10Rank: 10
等 级:贵宾
威 望:16
帖 子:852
专家分:1937
注 册:2014-4-10
得分:0 
值域为[0, 1],0代表不买,1代表买就行,约束为>=k。

梦想拥有一台龙芯3A-4000
2014-05-14 18:21
top398
Rank: 8Rank: 8
等 级:蝙蝠侠
威 望:2
帖 子:427
专家分:857
注 册:2014-5-2
得分:0 
论坛的一些问题实际上是数学问题,这更应该归于讨论算法的分论坛(没有注意是否有这样的分论坛)。
2014-05-14 18:29
loveClangage
Rank: 8Rank: 8
来 自:广东云浮
等 级:蝙蝠侠
帖 子:326
专家分:891
注 册:2013-8-23
得分:0 
路过,

编写的程序,不能改变世界,却可以改变自己...
2014-05-14 18:55
砖家的谎言
Rank: 12Rank: 12Rank: 12
等 级:禁止访问
威 望:30
帖 子:693
专家分:3898
注 册:2013-12-6
得分:0 
没看太明白

我不是砖家,要努力成为砖家。
2014-05-14 20:04
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
得分:0 
回复 2 楼 pangshch
只要计算方案是什么意思呢?没太懂
2014-05-14 20:07
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
得分:0 
回复 6 楼 砖家的谎言
是我的程序看不明白?还是题目
2014-05-14 20:07
岑吼吼
Rank: 1
等 级:新手上路
帖 子:23
专家分:0
注 册:2014-5-10
得分:0 
回复 3 楼 ditg
大神不能很明白你的意思,
2014-05-14 20:08
azzbcc
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:江西财经大学
等 级:贵宾
威 望:81
帖 子:3293
专家分:12919
注 册:2012-11-4
得分:15 
二分查找

程序代码:
#include <stdio.h>
#include <stdlib.h>

#define MAX  1000

int comp(const void *a, const void *b)
{
    return *(long long *)b - *(long long *)a;
}

// 在降序数组中找到小于 key 的最大数的 下标
size_t binserch(long long sa[MAX], int n, long long key)
{
    size_t low = 0, high = n - 1, mid;
    if (key == sa[low])
    {
        while (key == sa[low])  low++;
        return low;
    }
    if (key <= sa[high])  return n;
    if (key >  sa[low])   return low;
    while (low <= high)
    {
        mid = (low + high) / 2;
        if (key == sa[mid])
        {
            while (key == sa[mid])  mid++;
            return mid;
        }
        if (1 == high - low)  break;
        if (key < sa[mid])  low  = mid;
        if (key > sa[mid])  high = mid;
    }
    return high;
}

int main(int argc, char *argv[])
{
    int       t, n, count;
    long long k, v[MAX];

    for (scanf("%d", &t); t > 0; t -= 1)
    {
        count = 0;
        scanf("%d%lld", &n, &k);
        for (size_t i = 0; i < n; i++)  scanf("%lld", &v[i]);
        qsort(v, n, sizeof(long long), comp);

        size_t a = binserch(v, n, k / 3);
        for (size_t i = 0; i < a && i < n - 2; i++)
        {
            size_t b = binserch(v, n, (k - v[i]) / 2);
            for (size_t j = i + 1; j < b && j < n - 1; j++)
            {
                size_t c = binserch(v, n, k - v[i] - v[j]);
                if (1 + j < c)  count += c - j - 1;
            }
        }
        printf("%d\n", count);
    }

    return 0;
}


[ 本帖最后由 azzbcc 于 2014-5-14 23:36 编辑 ]


[fly]存在即是合理[/fly]
2014-05-14 23:05



参与讨论请移步原网站贴子:https://bbs.bccn.net/thread-431526-1-1.html




关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.203086 second(s), 9 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved