编程介的小学生 2017-02-12 03:59 采纳率: 20.5%
浏览 1197
已采纳

Analyzing Login/Logout Records

问题描述 :

You have a computer literacy course in your university. In the computer system, the login/logout records of all PCs in a day are stored in a file. Although students may use two or more PCs at a time, no one can log in to a PC which has been logged in by someone who has not logged out of that PC yet.You are asked to write a program that calculates the total time of a student that he/she used at least one PC in a given time period (probably in a laboratory class) based on the records in the file.

The following are example login/logout records.

  • The student 1 logged in to the PC 1 at 12:55

  • The student 2 logged in to the PC 4 at 13:00

  • The student 1 logged in to the PC 2 at 13:10

  • The student 1 logged out of the PC 2 at 13:20

  • The student 1 logged in to the PC 3 at 13:30

  • The student 1 logged out of the PC 1 at 13:40

  • The student 1 logged out of the PC 3 at 13:45

  • The student 1 logged in to the PC 1 at 14:20

  • The student 2 logged out of the PC 4 at 14:30

  • The student 1 logged out of the PC 1 at 14:40

For a query such as “Give usage of the student 1 between 13:00 and 14:30″, your program should answer “55 minutes”, that is, the sum of 45 minutes from 13:00 to 13:45 and 10 minutes from 14:20 to 14:30, as depicted in the following figure.

输入:

The input is a sequence of a number of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 10.Each dataset is formatted as follows.

N M

r

record1

recordr

q

query1

queryq

The numbers N and M in the first line are the numbers of PCs and the students, respectively. r is the number of records. q is the number of queries. These four are integers satisfying the following.

1 ≤ N ≤ 1000, 1 ≤ M ≤ 10000, 2 ≤ r ≤ 1000, 1 ≤ q ≤ 50

Each record consists of four integers, delimited by a space, as follows.

t n m s

s is 0 or 1. If s is 1, this line means that the student m logged in to the PC n at time t . If s is 0, it means that the student m logged out of the PC n at time t . The time is expressed as elapsed minutes from 0:00 of the day. t , n and m satisfy the following.

540 ≤ t ≤ 1260, 1 ≤ n ≤ N , 1 ≤ m ≤ M

You may assume the following about the records.

Records are stored in ascending order of time t.

No two records for the same PC has the same time t.

No PCs are being logged in before the time of the first record nor after that of the last record in the file.

Login and logout records for one PC appear alternatingly, and each of the login-logout record pairs is for the same student.

Each query consists of three integers delimited by a space, as follows.

ts te m

It represents “Usage of the student m between ts and te “. ts , te and m satisfy the following.

540 ≤ ts < te ≤ 1260, 1 ≤ m ≤ M

输出:

The input is a sequence of a number of datasets. The end of the input is indicated by a line containing two zeros separated by a space. The number of datasets never exceeds 10.Each dataset is formatted as follows.

N M

r

record1

recordr

q

query1

queryq

The numbers N and M in the first line are the numbers of PCs and the students, respectively. r is the number of records. q is the number of queries. These four are integers satisfying the following.

1 ≤ N ≤ 1000, 1 ≤ M ≤ 10000, 2 ≤ r ≤ 1000, 1 ≤ q ≤ 50

Each record consists of four integers, delimited by a space, as follows.

t n m s

s is 0 or 1. If s is 1, this line means that the student m logged in to the PC n at time t . If s is 0, it means that the student m logged out of the PC n at time t . The time is expressed as elapsed minutes from 0:00 of the day. t , n and m satisfy the following.

540 ≤ t ≤ 1260, 1 ≤ n ≤ N , 1 ≤ m ≤ M

You may assume the following about the records.

Records are stored in ascending order of time t.

No two records for the same PC has the same time t.

No PCs are being logged in before the time of the first record nor after that of the last record in the file.

Login and logout records for one PC appear alternatingly, and each of the login-logout record pairs is for the same student.

Each query consists of three integers delimited by a space, as follows.

ts te m

It represents “Usage of the student m between ts and te “. ts , te and m satisfy the following.

540 ≤ ts < te ≤ 1260, 1 ≤ m ≤ M

样例输入:

4 2
10
775 1 1 1
780 4 2 1
790 2 1 1
800 2 1 0
810 3 1 1
820 1 1 0
825 3 1 0
860 1 1 1
870 4 2 0
880 1 1 0
1
780 870 1
13 15
12
540 12 13 1
600 12 13 0
650 13 15 1
660 12 15 1
665 11 13 1
670 13 15 0
675 11 13 0
680 12 15 0
1000 11 14 1
1060 12 14 1
1060 11 14 0
1080 12 14 0
3
540 700 13
600 1000 15
1000 1200 11
1 1
2
600 1 1 1
700 1 1 0
5
540 600 1
550 650 1
610 620 1
650 750 1
700 800 1
0 0
样例输出:

55
70
30
0
0
50
10
50
0

  • 写回答

2条回答 默认 最新

  • devmiao 2017-02-13 18:14
    关注
     #include<cstdio>
    #include<cstring>
    #include<algorithm>
    #include<vector>
    using namespace std;
    struct data
    {
        int p,t;
        bool lg;
        data(){}
        data(int _p,int _t,bool _lg){p=_p;t=_t;lg=_lg;}
    };
    vector<data> po[10005];
    int main()
    {
        int n,m;
        //freopen("data.txt","r",stdin);
        while(scanf("%d%d",&n,&m),n||m)
        {
            for(int i=1;i<=m;i++)
                po[i].clear();
            int r,q,t,nn,mm,s;
            scanf("%d",&r);
            for(int i=0;i<r;i++)
            {
                scanf("%d%d%d%d",&t,&nn,&mm,&s);
                po[mm].push_back(data(nn,t,s));
            }
            scanf("%d",&q);
            for(int i=0;i<q;i++)
            {
                int x,y,len,ans=0,lx;
                scanf("%d%d%d",&x,&y,&mm);
                lx=x;
                len=po[mm].size();
                int cnt=0;
                for(int j=0;j<len;j++)
                {
                    if(po[mm][j].t>y)
                    {
                        if(cnt>0)
                            ans+=y-lx;
                        break;
                    }
                    else if(po[mm][j].t>=x)
                    {
                        if(cnt>0)
                            ans+=po[mm][j].t-lx;
                        lx=po[mm][j].t;
                    }
                    if(po[mm][j].lg)
                        cnt++;
                    else
                        cnt--;
                }
                printf("%d\n",ans);
            }
        }
        return 0;
    }
    
    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(1条)

报告相同问题?

悬赏问题

  • ¥15 使用C#,asp.net读取Excel文件并保存到Oracle数据库
  • ¥15 C# datagridview 单元格显示进度及值
  • ¥15 thinkphp6配合social login单点登录问题
  • ¥15 HFSS 中的 H 场图与 MATLAB 中绘制的 B1 场 部分对应不上
  • ¥15 如何在scanpy上做差异基因和通路富集?
  • ¥20 关于#硬件工程#的问题,请各位专家解答!
  • ¥15 关于#matlab#的问题:期望的系统闭环传递函数为G(s)=wn^2/s^2+2¢wn+wn^2阻尼系数¢=0.707,使系统具有较小的超调量
  • ¥15 FLUENT如何实现在堆积颗粒的上表面加载高斯热源
  • ¥30 虚心请教几个问题,小生先有礼了
  • ¥30 截图中的mathematics程序转换成matlab