搜索
查看: 246|回复: 1
打印 上一主题 下一主题

求教那个纪念品分组问题

[复制链接]
跳转到指定楼层
楼主
发表于 2017-10-14 15:06:38 | 只看该作者 回帖奖励 |倒序浏览 |阅读模式
我的代码有问题吗?为什么不对啊。。。。
#include<stdio.h>

int book[30001];
void sort(int A[], int N);
int main()
{
        int w, n,i,j,sum,A[50],x;
        scanf("%d", &w);
        scanf("%d", &n);
        for(i=0;i<n;i++)
        {
                scanf("%d", &j);
                A[i] = j;
                book[i] = 0;
        }
        sort(A, n);
        for(i=0;i<n;i++)
        {
          printf("%d ",A[i]);
        }
    printf("\n");
        sum=0;
        for (i = 0; i < n; i++)
        {
                x = 0;

                for (j = n - 1; j >=0; j--)
                {
                    if(j==i)
                continue;
                        if (A[i] + A[j] <= n && book[i] == 0 && book[j] == 0)
                        {
                                book[i] = 1;
                                book[j] = 1;
                                sum++;
                                x = 1;
                                break;
                        }
           }
                if (x == 0 && book[i] == 0)
                {
                        sum++;
                        book[i] = 1;
                }

        }
        printf("%d", sum);
        return 0;
}
void sort(int A[], int N)
{
        int i, j, temp;
        for (i = 0; i <= N - 1; i++)
        {
                for (j = i; j <= N-1; j++)
                {
                        if (A[i]<A[j])
                        {
                                temp = A[j];
                                A[j] = A[i];
                                A[i] = temp;
                        }
                }
        }
}


沙发
 楼主| 发表于 2017-10-14 21:54:45 | 只看该作者
成功解决了,但是最后两个测试时间超限了,有点难解决。
#include<stdio.h>

int book[30001], A[30001];//定义两个数组,A数组存储数据,book数组标记是否已经排序
void sort(int left, int right);
int main()
{
        int w, n, i, j, sum, x;
        scanf("%d %d", &w,&n);
        for (i = 0; i<n; i++)//循环读入数据
        {
                scanf("%d", &j);
                A[i] = j;
                book[i] = 0;
        }
        sort(0, n - 1);
        sum = 0;
        for (i = 0; i < n; i++)
        {
                x = 0;

                for (j = n - 1; j >= 0; j--)
                {
                        if (j == i)
                                continue;
                        if (A[i] + A[j] <= w && book[i] == 0 && book[j] == 0)
                        {
                                book[i] = 1;
                                book[j] = 1;
                                sum++;
                                x = 1;
                                break;
                        }
                }
                if (x == 0 && book[i] == 0)
                {
                        sum++;
                        book[i] = 1;
                }
        }
        printf("%d", sum);
        return 0;
}
//快速排序
void sort(int left, int right)
{
        int i, j, t, temp;
        if (left>right)
                return;
        temp = A[left];
        i = left;
        j = right;
        while (i != j)
        {
                while (A[j] <= temp&&i < j)
                        j--;
                while (A[i] >= temp&&i < j)
                        i++;
                if (i<j)
                {
                        t = A[i];
                        A[i] = A[j];
                        A[j] = t;
                }
        }
        A[left] = A[i];
        A[i] = temp;
        sort(left, i - 1);
        sort(i + 1, right);
}
您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

广播台
特别关注
快速回复 返回顶部 返回列表