zoukankan      html  css  js  c++  java
  • hdu 3262 09 宁波 现场 C

    Description

    Students often have problems taking up seats. When two students want the same seat, a quarrel will probably begin. 

    It will have very bad effect when such subjects occur on the BBS. 
    So, we urgently need a seat-taking-up rule. After several days of argument, the rule finally comes out: 
    As shown in the figure below, the seats in a classroom form a n×m grid( n rows and m columns), and every cell in the grid represents a seat. The coordinates of the seat in the north-west corner are (1,1) and the coordinates of the seat in the south-east corner seat are (n,m). As you know, some seats make you feel good and some seats don’t. So every seat has a “feeling index”. 

    Students can take up seats for himself and his friends. Of course, if a seat is already taken up by a student, it can’t be taken up by others. 
    For the convenience of communication between friends, when a student is trying to take up seats, he wants all the seats he needs to be consecutive and in the same row. If he can do that, he takes up all the seats he needs, and save the most western one for himself. For example, if a student wants to take up 3 seats, then taking (2,2),(2,3),(2,4) and saving (2,2) for himself is ok; but taking (2,2),(2,4),(2,5) is invalid because those seats are not consecutive. Under the precondition of accomplishing his seat-taking job, a student always wants the “feeling index” of his seat to be as large as possible. 
    However, if a student cannot take up all the seats he needs, he will just try to take up only one seat for himself because he doesn’t want to get into the trouble of explaining “Why they can get seats but I can’t?” to some of his friends. Of course he still wants the “feeling index” of his seat to be as large as possible in that situation. 
    Everyone wants to know where are the seats he can take up .This problem seems a little bit complicated for them. So they want you to write a program to solve the problem. 
     

    Input

    There are several test cases and the input ended by a line of “0 0 0”. 
    For each test case: 
    The first line contains three integers: n , m and k ( 1 <= n,m<=30, 1<=k<=50). It means that there are n rows of seats in the classroom and there are m seats in every row. k is the number of students who come into the classroom trying to take up seats. 
    Following are n lines describing the seats by north to south order .Each line represents a row of seats and contains m integers, indicating the “feeling index” of every seat in that row, by west to east order. “Feeling index” can be fit in a 32-bit integer. 
    Then k lines follow (We call them k “student lines”). Each line is in the format of “hh:mm q” ( 0 <= hh < 24, 0 <=mm <= 59, 1<=q<=50 ) meaning that a student comes into the classroom at mm minutes past hh o’clock, trying to take up q seats. mm and hh are all two digit integers with possible leading zero, and q is also an integer. Please note that when a student enters the class room, he begins to do his seat taking job immediately and the job takes no time. 
    It is guaranteed that the “feeling index” of every seat is different and no students come into the classroom at the same time. 
     

    Output

    You should output k lines for each test case, in the order that correspondent to the above mentioned k “student lines” in the input. Each line must contain two integers indicating the coordinates of the seat which is saved by the student for himself. If the student can’t take up any seats, just output a “-1” instead.
     

    Sample Input

    5 5 8 11 12 15 14 13 21 22 25 24 23 16 17 20 19 18 6 7 10 8 9 1 2 5 4 3 09:00 2 09:01 5 09:02 5 09:03 5 09:04 5 09:05 3 09:06 2 09:07 3 0 0 0
     

    Sample Output

    2 3 3 1 1 1 4 1 5 1 2 5 2 1 -1
     
    题意:占座,每个同学有两种占座方案 1 占在同一行,自己坐在最西边 2 只占自己的 
    优先给同学占座,分别在这两种情况下使自己舒适值最高
    这是io07熊的代码
     
     
    #include <cstdio>
    #include <cstdlib>
    #include <iostream>
    #include <cstring>
    #include <algorithm>
    
    using namespace std;
    
    const int maxn=40;
    const int maxq=60;
    
    int graph[maxn][maxn];
    bool flag[maxn][maxn];
    int n,m,k;
    
    struct quest
    {
    	int time,num,q;
    	int x,y;
    } P[maxq];
    
    bool cmp1(quest A,quest B)
    {
    	return A.time<B.time;
    }
    bool cmp2(quest A,quest B)
    {
    	return A.num<B.num;
    }
    
    void solve(quest &kk)
    {
    	int ax,ay,sx,sy,cnt;
    	ax=ay=sx=sy=-1;
    	for(int i=0;i<n;i++){
    		for(int j=0;j<m;j++){
    			if(flag[i][j]) continue;
    			cnt=0;
    			if((ax==-1&&ay==-1)||(graph[i][j]>graph[ax][ay])){
    				ax=i; ay=j;
    			}
    			for(int k=j;k<m;k++){
    				if(flag[i][k]) break;
    				else cnt++;
    			}
    			if(cnt>=kk.q){
    				if((sx==-1&&sy==-1)||(graph[i][j]>graph[sx][sy])){
    					sx=i; sy=j;
    				}
    			}
    		}
    	}
    	if(sx==-1&&sy==-1){
    		kk.x=ax;
    		kk.y=ay;
    		if(kk.x!=-1) flag[kk.x][kk.y]=1;
    	}
    	else{
    		kk.x=sx;
    		kk.y=sy;
    		for(int i=0;i<kk.q;i++) flag[kk.x][kk.y+i]=1;
    	}
    }
    
    int main()
    {
    	char cc[20];
    	int tt,num1,num2,ll;
    	while(scanf("%d%d%d",&n,&m,&k),n!=0||m!=0||k!=0){
    		for(int i=0;i<n;i++) for(int j=0;j<m;j++) scanf("%d",&graph[i][j]);
    		memset(flag,0,sizeof(flag));
    		for(int i=0;i<k;i++){
    			scanf("%s %d",cc,&tt);
    			P[i].num=i;
    			P[i].q=tt;
    			ll=strlen(cc);
    			if(cc[2]==':'){
                    num1=((cc[0]-'0')*10+(cc[1]-'0'))*60;
                    if(ll-3>=2) num2=(cc[3]-'0')*10+(cc[4]-'0');
                    else num2=cc[3]-'0';
    			}
    			else{
                    num1=(cc[0]-'0')*60;
                    if(ll-2>=2) num2=(cc[2]-'0')*10+(cc[3]-'0');
                    else num2=cc[2]-'0';
    			}
    			P[i].time=num1+num2;
    		}
    		sort(P,P+k,cmp1);
    		for(int i=0;i<k;i++) solve(P[i]);
    		sort(P,P+k,cmp2);
    		for(int i=0;i<k;i++){
    			if(P[i].x==-1) printf("-1
    ");
    			else printf("%d %d
    ",P[i].x+1,P[i].y+1);
    		}
    	}
    	return 0;
    }
    

      

  • 相关阅读:
    MySQL高可用架构之MHA
    DateTimeFormatter
    mysql实现行拼接、列拼接
    图形数据库 Neo4j 开发实战
    除了信号触发线程与接收者线程相同的情况能直接调用到slot,其它情况都依赖事件机制(解决上面代码收不到信号的问题其实很简单,在线程的run();函数中添加一个事件循环就可以了,即加入一句exec();),信号槽不就是一个回调函数嘛
    moveToThread的根本目的还是为了处理QObject的事件循环(如果为空指针的话,当前对象的所有的事件都不处理了),看官方说明就知道了
    专访紫光刁石京:资本追逐下产业“过热” 人才培养需塌下心(企业这么多年好不容易积累起来的人才队伍,被别人这么一挖,一切付诸东流)
    为QML创建C++插件(下载)
    Qt Quick Controls 与 Qt Quick Controls 2的区别(详细对照)
    asp.net core zipkin
  • 原文地址:https://www.cnblogs.com/xuesu/p/4089999.html
Copyright © 2011-2022 走看看