104 条题解

  • 5
    @ 2017-10-14 11:01:02

    格式不好题解重发!
    好难的模拟!
    欺负我语文不好!

    #include<cstdio>
    int a[22][22],t[22][22],d[404],w[22],c[22];
    bool f[22][404];
    int maxn;
    bool usin(int start,int end,int machine)
    {
        for (int i=start;i<end;i++)
            if  (f[machine][i])  return 0;
        return 1;
    }
    int main()
    {
        int m,n,i,j,time,k,now,machine;
        scanf("%d%d",&m,&n);
        for (i=1;i<=m*n;i++) scanf("%d",&d[i]);
        for (i=1;i<=n;i++)
            for (j=1;j<=m;j++)
                scanf("%d",&a[i][j]);
        for (i=1;i<=n;i++)
            for (j=1;j<=m;j++)
                scanf("%d",&t[i][j]);
        for (i=1;i<=m*n;i++)
        {
            now=d[i];                                 //当前工程。 
            time=t[now][++w[now]];                    //当前工序所用时间。 
            machine=a[now][w[now]];                   //当前工序所需机器。 
            for (j=c[now]+1;;j++)                     //当前工序最早开始时间。 
                if (usin(j,j+time,machine))           //若当前工序所需机器在从j开始时间段完全空闲。 
                {
                    for (k=j;k<j+time;k++)            //将所用机器在该时间段状态置为繁忙。 
                        f[machine][k]=1;
                    if (j+time-1>maxn) maxn=j+time-1; //取所有机器最长工作时间。 
                    c[now]=j+time-1;                  //更新当前工程已用时间。 
                    break;
                }
        }
        printf("%d",maxn);
        return 0;
    }
    
  • 4
    @ 2017-10-12 15:31:15

    我们教练说这是一道语文题2333
    首先先对样例进行分析,发现题中所给的顺序是安排时的顺序,即最后哪道工序先开始和顺序没有必然联系,因为即使靠后安排的也可以插入到前面
    那么安排顺序对工序的影响到底是什么?根据要求三,我们可以看出在安排一道工序时要贪心地选取最靠前的一段区间
    到这里可以分析出对时间有影响的只有两个因素:
    1.当前工件的上一道工序完成的时间
    2.该工件此道工序所用的机器(有点绕)最靠前的可以完成此道工序的一段空闲时间
    由此,可以得出策略应该是从该工件上一道工序完成时间开始找该机器的空闲区段
    因此我们只需要维护这两个量就可以了
    由于n小于20
    于是有了一个n^5的极度暴力算法

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    using namespace std;
    int ord[410],use[22][22],tim[22][22],beg[22],zhan[22],gai[22];
    int kongqian[22][410];//此处为第n号机器的在那些时间是空闲的
    int main()
    {
        //freopen("jsp.in","r",stdin);
        //freopen("jsp.out","w",stdout);
        int n,m,i,k,now=0,a,least=0,b,c,has;
        cin>>m>>n;
        memset(beg,-1,sizeof(beg));
        for(i=1;i<=n*m;i++)
         cin>>ord[i];
        for(i=1;i<=n;i++)
         for(k=1;k<=m;k++)
          cin>>use[i][k];
        for(i=1;i<=n;i++)
         for(k=1;k<=m;k++)
          cin>>tim[i][k];
        for(i=1;i<=n*m;i++)
        {
            a=ord[i];//工件
            gai[a]++;
            b=gai[a];// 工序
            c=use[a][b];//机器
            has=0;
            for(k=beg[a]+1;;k++)
            {
                if(!kongqian[c][k])//该机器在这个点没有被用
                 has++;
                else
                 {
                    has=0;
                    continue;
                 }
                 if(has==tim[a][b])//有可以插入的区间
                  break;
            }
            for(int j=k;j>k-tim[a][b];j--)//标记为已用
              kongqian[c][j]=1;
            beg[a]=k;
            least=max(least,beg[a]+1);//是否加1取决于标记占用时的策略
        }
        cout<<least<<endl;
        return 0;
    }
    
  • 1
    @ 2021-08-24 13:10:44
    #include<bits/stdc++.h>
    #define LL long long
    using namespace std;
    
    inline void read(int &x){
        x=0;int f=1;char c=getchar();
        while(c>'9'||c<'0'){
            if(c=='-')
                f=-1;
            c=getchar();
        }
        while(c>='0' && c<='9'){
            x=(x<<1)+(x<<3)+(c^48);
            c=getchar();
        }
        x*=f;
    }
    
    struct node{
        int num,tim;
    }e[22][22];
    
    int mac[22][40000];
    int ord[400],now[22],be[22];
    int main()
    {
        int n,m; cin>>m>>n;
        int tmp=n*m;
        for(int i=1;i<=tmp;i++) read(ord[i]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>e[i][j].num;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>e[i][j].tim;
        int ans=0;
        for(int i=1;i<=tmp;i++){
            int whi=ord[i];
            int wha=(++now[whi]);
            int ma=e[whi][wha].num;
            int go=e[whi][wha].tim;
            int cnt=0,end;
            for(int j=be[whi]+1;;j++){
                if(mac[ma][j]==0)
                    cnt++;
                else
                    cnt=0;
                if(cnt==go){
                    end=j;
                    break;
                }
            }
            for(int j=end-go+1;j<=end;j++)
                mac[ma][j]=1;
            be[whi]=end;
            ans=max(ans,end);
        }
        cout<<ans;
        return 0;
    }
    
  • 1
    @ 2017-10-27 16:40:36

    这道题...我认为是一道不能算“简单”的模拟

    首先,出题者不仅在考察代码实现能力,

    更在考验你的语文水平( 唉...... )

    闲话不多说了,注释都在代码里了...

    cpp..

    #include<bits/stdc++.h>     // 烂大街的头文件
    using namespace std;
    int work[21];         //  记录第 i 个工件所做的工序
    int num[501];         //  记录第 i 个工序的安排序列
    int lasttime[21];       //  记录第 i 号工件当前所用的最晚时间
    int time[21][21];       //  记录 i 号工件第 j 个工序所用的时间
    int need[21][21];      //  记录 i 号工件第 j 个工序所需的机器
    bool mac[21][501];     //  记录 i 号机器第 j 分钟的状态( 是否空闲 )
    int main()
    {
        int m,n,ans=0,s=0;
        scanf("%d%d",&m,&n);
        for(int i=1;i<=m*n;i++)
            scanf("%d",&num[i]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&need[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                scanf("%d",&time[i][j]);
        //  输入完毕,准备开始 “ ‘ 易懂 ’ ” 的核心部分
        for(int i=1;i<=n*m;i++)
        {
            work[num[i]]++;    //  工序++
            for(int j=lasttime[num[i]]+1;;j++)    //  寻找机器空闲状态的循环
            {
                if(mac[need[num[i]][work[num[i]]]][j]==0)    // ... 查看机器是否空闲...( 注意看清括号 )
                    s++;
                else  s=0;
                if(s==time[num[i]][work[num[i]]])    //  机器表示:我闲着!!
                {
                    for(int k=j-s+1;k<=j;k++)    //  在这段时间上安排工作
                        mac[need[num[i]][work[num[i]]]][k]=1;
                    lasttime[num[i]]=j;    //  注意更新最晚时间
                    s=0;    //  必要的
                    break;    //  操作
                }
            }
        }    // 简短的核心部分
        for(int i=1;i<=n;i++)
            ans=max(ans,lasttime[i]);    //  总时间即为某工件的最晚时间
        printf("%d",ans);
        return 0;    //  庄严的结束程序..
    }
    
    
    • @ 2017-11-01 20:31:53

      似乎 Compile Error

  • 0
    @ 2016-08-02 16:43:40

    语文问题。。语文问题。。语文问题。。
    强烈bs出题人

  • 0
    @ 2015-09-12 17:59:35

    #include<iostream>
    #include<cstdio>
    #include<cstring>
    #include<cmath>
    #include<algorithm>
    using namespace std;
    const int MAXN = 30;
    const int N = 3000;

    int num[MAXN*MAXN];
    bool s[MAXN][N + 10];

    struct Thing{
    int use[MAXN], time[MAXN], down, last;
    }t[MAXN];

    void init(int x, int y){
    for(int i=1; i<=x; i++)
    t[i].down = 1;
    for(int i=1; i<=y; i++)
    for(int j=1; j<=N; j++)
    s[i][j] = 0;
    for(int i=1; i<=x; i++)
    t[i].last = 1;
    }

    int main()
    {
    int m, n;
    scanf("%d%d", &m, &n);//m:机器数,工序数
    //n:工件数
    init(n, m);
    for(int i=1; i<=n*m; i++)
    scanf("%d", &num[i]);
    for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    scanf("%d", &t[i].use[j]);
    for(int i=1; i<=n; i++)
    for(int j=1; j<=m; j++)
    scanf("%d", &t[i].time[j]);
    for(int i=1; i<=n*m; i++){
    int bri = 0, z = t[num[i]].use[t[num[i]].down], flag = 0;
    for(int j=t[num[i]].last; j<=N; j++){
    if(!s[z][j]){
    bri = 0;
    for(int x=j; x<=N; x++){
    if(!s[z][x])
    bri++;
    else{
    j = x;
    break;
    }
    if(bri == t[num[i]].time[t[num[i]].down]){
    flag = x;
    break;
    }
    }
    if(flag){
    t[num[i]].last = flag +1;
    for(int x=j; x<=flag; x++)
    s[z][x] = 1;
    break;
    }
    }
    }
    t[num[i]].down += 1;
    }
    int ans = 0;
    for(int i=1; i<=n; i++)
    ans = max(ans, t[i].last-1);
    printf("%d", ans);
    return 0;
    }
    模拟

  • 0
    @ 2014-10-21 20:11:34

    #include<cstdio>
    #include<iostream>
    using namespace std;
    int n,m,a[405],q[25][25],t[25][25],s[25][8005],tot[25],maxn=-1,ss[25];
    int main()
    {
    freopen("jsp.in","r",stdin);
    freopen("jsp.out","w",stdout);
    scanf("%d%d",&m,&n);
    for(int i=1;i<=n*m;i++)scanf("%d",&a[i]);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    scanf("%d",&q[i][j]);
    for(int i=1;i<=n;i++)
    for(int j=1;j<=m;j++)
    scanf("%d",&t[i][j]);
    for(int i=1;i<=n;i++)ss[i]=0;
    for(int i=1;i<=m*n;i++)
    {
    int k=++tot[a[i]];//工件a[i]待安排的工序
    int kq=q[a[i]][k];//工件a[i]待安排的工序要用的机器
    int kt=t[a[i]][k];//工件a[i]待安排的工序要用的时间
    int L=0;
    for(int j=ss[a[i]]+1;j<=8000;j++)//ss[a[i]]表示工件a[i]上一次操作结束时间
    {
    if(s[kq][j]==0) L++;
    else L=0;
    if(L==kt)
    {
    for(int kk=j;kk>=j-L+1;kk--)
    s[kq][kk]=1;
    ss[a[i]]=j;

    break;
    }
    }
    }
    for(int i=1;i<=m;i++)
    for(int j=8000;j>=1;j--)
    if(s[i][j]==1)
    {
    maxn=max(maxn,j);
    break;
    }
    printf("%d",maxn) ;
    return 0;
    }

  • 0
    @ 2013-10-24 16:12:15

    是语文水平问题...

  • 0
    @ 2010-07-16 14:43:28

    真的是语文水平问题...

  • 0
    @ 2009-11-19 20:50:47

    真的是语文水平问题...

  • 0
    @ 2009-11-18 20:47:33

    #include

    #define max(a,b) (a>b ? a:b)

    short time[200][1000]={0};

    struct WorkPiece

    {

    int mach[20];

    int spend[20];

    int i,begin;

    }

    wp[20];

    void setup(int n)

    {

    int i;

    for (i=1;i

  • 0
    @ 2009-11-11 20:22:51

    我在cena上测,内存压5000

    10个点用0.14s

    到VJ上,竟然……

    编译通过...

    ├ 测试数据 01:运行时错误...|错误号: 216

    ├ 测试数据 02:运行时错误...|错误号: 216

    ├ 测试数据 03:运行时错误...|错误号: 216

    ├ 测试数据 04:运行时错误...|错误号: 216

    ├ 测试数据 05:答案错误...程序输出比正确答案长

    ├ 测试数据 06:运行时错误...|错误号: 216

    ├ 测试数据 07:运行时错误...|错误号: 216

    ├ 测试数据 08:运行时错误...|错误号: 216

    ├ 测试数据 09:答案错误...程序输出比正确答案长

    ├ 测试数据 10:运行时错误...|错误号: 216

    ---|---|---|---|---|---|---|---|-

    Unaccepted 有效得分:0 有效耗时:0ms

    我服了VJ…………

    还是服务器让人家弄的有点…………

  • 0
    @ 2009-11-10 12:07:53

    生产线的布尔数组要开到2000+左右。。-,-。。

  • 0
    @ 2009-11-08 06:28:36

    想死的心都有。。。。学校模拟赛上做的。。

    读入的数组开了0..20。。

    必然的201.。。。。。50分啊!!!

  • 0
    @ 2009-11-04 19:17:47

    这题的数据有问题,其中输入时间时有一个点的数据中多了一个数,导致‘read’与

    'readln'算出的结果不同

  • 0
    @ 2009-11-03 22:30:59

    这题考的其实是政治。。。。。

  • 0
    @ 2009-11-02 17:02:15

    囧。。readln加了第六个点就过不了了

  • 0
    @ 2009-10-29 09:23:43

    题号竟然是1314,嗯 不 错 不 错

  • 0
    @ 2009-10-28 16:16:10

    关键是没有图。。。。

    而且 if ans = 112 then writeln(116) //Cheat 。。。。

    ORZ那些一次AC的PASCAL神牛

  • 0
    @ 2009-10-27 19:36:30

    看不懂....看不懂....

信息

ID
1314
难度
3
分类
模拟 点击显示
标签
递交数
1748
已通过
826
通过率
47%
被复制
15
上传者