C语言高手 帮忙看一下 以前NOIP的一个题目

Fromleocy002纪念品分组全国青少年信息学奥林匹克分区联赛(NOIp)竞赛原题描述Description元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为... From leocy002
纪念品分组 全国青少年信息学奥林匹克分区联赛 (NOIp) 竞赛原题

描述 Description
元旦快到了,校学生会让乐乐负责新年晚会的纪念品发放工作。为使得参加晚会的同学所获得 的纪念品价值相对均衡,他要把购来的纪念品根据价格进行分组,但每组最多只能包括两件纪念品, 并且每组纪念品的价格之和不能超过一个给定的整数。为了保证在尽量短的时间内发完所有纪念品,乐乐希望分组的数目最少。

你的任务是写一个程序,找出所有分组方案中分组数最少的一种,输出最少的分组数目。

【限制】

50%的数据满足: 1 <=n <= 15

100%的数据满足: 1 <= n <= 30000, 80 <= W <= 200

输入格式 Input Format
第1行包括一个整数w,为每组纪念品价格之和的上限= 第2行为一个整数n,表示购来的纪念品的总件数G

第3-n+2行每行包含一个正整数Pi (5 <= Pi <= w3)w表示所对应纪念品的价格。

输出格式 Output Format
仅1行,包含一个整数, ep最少的分组数目和

100
9
90
20
20
30
50
60
70
80
90

pur out:
6

#include <stdio.h>

int main()
{
int i,j,w,n, temp,number=0, a[500000];
scanf("%d", &w);
scanf("%d", &n);

for(i=1; i<=n; i++)
scanf("%d", &a[i]);

for(i=0;i<=n-1;i++)
for(j=1;j<n-i;j++)
if(a[j]>a[j+1])
{
temp=a[j];
a[j]=a[j+1];
a[j+1]=temp;
}

i=1,j=n;
while(i<=j)
{
if(i==j)
{ number++;
j--;}

else
if(a[i]+a[j]>w)
{
number++;
j--;
}

else if(a[i]+a[j]<=w)
{number++;
i++;
j--;
}

}

printf("%d",number);
return 0;

}

这是我的程序~!
这一题用贪心策略完全可以的.
先排序 然后两头放指针往中间移~!~!
可是为什么我 的方法在VIJOS上超时 谁帮我看一下
100分 只过了六个点 ??
别人怎么就可以过? 我哪里的效率出了问题 看一下 等
展开
 我来答
qcs1101
2009-06-12 · TA获得超过518个赞
知道小有建树答主
回答量:666
采纳率:0%
帮助的人:648万
展开全部
1、你用的排序是冒泡排序,是最慢的。最少也用个选择排序吧?!仔细查查各 种排序算法的效率。
2、把while(i<=j)改成i<j,把if(i==j)这语句单拿出来放到while后面(外面)去执行。可以节省判断次数。这条你仔细想想。
3、数组a太大了,30001就够了吧?节约分配管理内存的时间。(想再快,把int a[]变成unsigned char a[])

最后,程序是对的,就是不精益求精。

ps:分数为O,太小气了吧?!
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式