ACM第二弹【Commando War】

  怎么说呢,这一题应该算是百分之九十以上都是自己写的吧(因为完全看不懂解析上面的代码啊啊啊啊啊啊啊T_T),首先,分析题目,要使得尽早完成任务,必须给执行任务时间最长的那个家伙最先分派任务,因为一次只能交代一个任务,令交代第i个家伙的任务所花的时间为Bi,完成所以任务所花时间Bcost至少为B0+B1+……+B(n-1)+J(n-1),因为B0+B1+……+B(n-1)始终是不变的,所以要使总时间最小,就要让J(n-1)最小,毫无疑问,直接排序,把Ji最小的那个人放在最后指派任务23333333

废话少说,先放代码:

#include <iostream>
#include <stdio.h>
using namespace std;

struct comd
{
    int b, j;
};

void sort(struct comd*begin, struct comd*end);

int main()
{
    int n, ph = 0;
    struct comd comd[1000];    //这一段开始的时候没有设定大小导致直接爆掉,太伤感了T_T
    while(scanf("%d", &n) == 1 && n)
    {
        for(int i = 0; i < n; i++) scanf("%d%d", &comd[i].b, &comd[i].j);
        sort(comd, comd+n);
        int B = 0, p = 0, Bcost = 0;    //注意变量的定义,就是因为定义到循环外面去了导致结果一直出错T_T
        for(int  i = 0; i < n; i++) B += comd[i].b;
        for(int i = 0; i < n-1; i++)
        {
            B -= comd[i].b;
            if(comd[i].j < B+comd[n-1].j) p++;
            else {p = i; break;}
        }
        for(int i = 0; i <= p; i++)   Bcost += comd[i].b;
        Bcost += comd[p].j;
        ph++;
        printf("case %d : %d\n", ph, Bcost);
    }
    return 0;
}

void sort(struct comd*begin, struct comd*end)    //冒泡排序还不是很熟啊,看来还是要多加练习!!!!
{
    struct comd temp;
    int n = end - begin, i, k;
    for(i = 0; i < n; i++)
    {
        for(k = 0; k < n-i; k++)
        {
            if((begin+k+1)->j > (begin+k)->j)
            {
                temp = *(begin+k);
                *(begin+k) = *(begin+k+1);
                *(begin+k+1) = temp;
            }
        }
    }
    return;
};

感觉自己的方法好笨拙……但是实在是不理解那些库函数 = =

posted @ 2013-11-05 13:12  傀儡之城  阅读(192)  评论(1)    收藏  举报