HNU 12988 It Can Be Arranged

HNU 12988      It Can Be Arranged

http://acm.hnu.cn/online/?action=problem&type=show&id=12988&courseid=0

n个课程      每个教室的容量是m个人  给出n个课程的开始和结束时间  以及上课的人数

给出n*n的矩阵  a(i,j)表示第i个课程之后 如果j课程也要使用该教室 就要花这么多的时间去打扫教室

求需要安排的最少的教室

第一感觉是跟在hdu上做的一题差不多 那个是餐厅来顾客吃饭  安排桌子的问题

写了一半感觉不对 因为第i个课程结束之后不知道要选取哪个课程的打扫时间

后来发现有人过了 就觉得应该是暴力过的 就试着 往后写了  后来就过了。。

总的来说还是觉得这题有点问题的 也许是数据太水了。。。没有给出想到的那种情况的数据

#include <cstdio>
#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <string.h>
#include <string>
#include <queue>

#define eps 1e-8
#define op operator
#define MOD  10009
#define MAXN  100100

#define FOR(i,a,b)  for(int i=a;i<=b;i++)
#define FOV(i,a,b)  for(int i=a;i>=b;i--)
#define REP(i,a,b)  for(int i=a;i<b;i++)
#define REV(i,a,b)  for(int i=a-1;i>=b;i--)
#define MEM(a,x)    memset(a,x,sizeof a)
#define ll __int64

using namespace std;

struct st
{
    int ti;
    int num;
    int order;
    int ct[110];//打扫时间
    bool operator <(const st p)const
    {
        return ti>p.ti;
    }
};//开始时间
st s[110];

struct ft
{
    int ti;
    int num;
    int order;
    bool operator <(const ft p)const
    {
        return ti>p.ti;
    }
};//结束时间
ft f[110];

priority_queue<st> q;
priority_queue<ft> p;

int main()
{
//freopen("ceshi.txt","r",stdin);
    int tc;
    scanf("%d",&tc);
    int cs=1;
    while(tc--)
    {
        int n,m;
        scanf("%d%d",&n,&m);
        int cnt=1;
        for(int i=1;i<=n;i++)
        {
            int a,b,ss;
            scanf("%d%d%d",&a,&b,&ss);
            s[cnt].ti=a; s[cnt].num=ss; s[cnt].order=i;
            f[cnt].ti=b; f[cnt].num=-ss;f[cnt].order=i;
            p.push(f[cnt]);
            cnt++;
        }
        for(int i=1;i<=n;i++)
        {
            for(int j=1;j<=n;j++)
            {
//            if(i==j)  continue;
                int x;
                scanf("%d",&x);
                s[i].ct[j]=x;
            }
            q.push(s[i]);
        }
        st xx; ft yy;
        int mx=-1;
        int z=0;
        while(!q.empty())
        {
            xx=q.top();
            yy=p.top();
            int start=xx.ti;
            int finish=yy.ti;
            int k=xx.order;
//            cout<<"yy.order  "<<yy.order<<endl;
//            cout<<"kk  "<<k<<endl;
//            cout<<"s.ct[k]"<<s[yy.order].ct[k]<<"  finish  yy.order  "<<finish<<"  "<<yy.order<<endl;
//            cout<<"start "<<start<<endl;
            if((s[yy.order].ct[k]+finish)<start)
            {
//                cout<<"zzzz"<<z<<endl;
                z+=(yy.num)/m;
                if(yy.num%m)  z++;
                p.pop();
//                cout<<"1111zzzz"<<z<<endl;
//                cout<<"num "<<yy.num<<endl;
            }
            else
            {

                z+=(xx.num)/m;
                if(xx.num%m)  z++;
                q.pop();
//                cout<<"2222zzzz"<<z<<endl;
//                cout<<"num "<<xx.num<<endl;
            }
            mx=max(mx,z);
        }
        while(!p.empty())  p.pop();
        printf("Case %d: %d\n",cs++,mx);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值