首页 > 代码库 > hdu1871 无题 (贪心扫描)

hdu1871 无题 (贪心扫描)

Problem Description

http://acm.hdu.edu.cn/showproblem.php?pid=1871

就要复试了,外地的考生都要在学校附近住宾馆了。假设在学校附近有C家宾馆,并且这些宾馆只有单人房,而每家宾馆的价格不一样,学生们都想找价格便宜的住,所以现在需要你的帮助,当有学生需要住宾馆的时候,告诉他哪个宾馆还有空的房间并且价格最便宜。而且有一个要求,同一个组的学生要住在同一个宾馆。
Input
输入包括多组数据。输入首先包括一个整数T(T <= 50),代表有T组数据。
每组数据首先是一个整数C(C <= 100),代表宾馆的个数,接下来是C行数据,每行3个整数,第一个代表宾馆的编号(<=1000),第二个是宾馆的房间数(<=50),第三个是宾馆的价格(<=1000)。
然后是一个整数T (T <= 1000),代表想找宾馆住的小组,接下来的T行每行代表一个要找宾馆的小组,每个小组不超过10人。
Output
对于每组数据中的想找宾馆的小组,输出他们应该找的宾馆编号。如果没有合适的宾馆或已经住满,输出”sorry”.
Sample Input
1 2 1 2 100 2 3 120 4 3 1 1 5
Sample Output
2 1 1 sorry题目分析;直接扫描即可,找到可以的方案就进行分配,当下次再遇到更优的方案,还原上次方案的分配的数量,进行此次分配,直到全部分配或者不能分配。当然此题也可以排序。AC代码:
/**
 *贪心,排序或者扫描
 */
#include<iostream>
#include<cstdio>
#include<map>
#include<cstring>
#include<string>
#include<algorithm>
#include<queue>
#include<vector>
#include<stack>
#include<cstdlib>
#include<cctype>
#include<cstring>
#include<cmath>
using namespace std;
struct room{
    int id;//编号
    int room;//房间数
    int value;//价值
};
room r[110];
int main()
{
    int t,c;
    cin>>t;
    while(t--){
        cin>>c;
        for(int i=0;i<c;i++){
            cin>>r[i].id>>r[i].room>>r[i].value;
        }
        int n,x,ok,k;
        cin>>n;
        for(int i=0;i<n;i++){
            cin>>x; ok=0; k=0;
            for(int j=0;j<c;j++){
                if(ok==0&&r[j].room>=x){
                    k=j; ok=1;//第一次找到
                    r[k].room-=x;//房间数减少
                }
                if(ok&&r[j].room>=x&&r[k].value>r[j].value){//找到最便宜
                    r[k].room+=x;//回溯上一个房间
                    k=j;
                    r[k].room-=x;//减少下一个房间
                }
            }
            if(ok){
                cout<<r[k].id<<endl;
            }
            else{
                cout<<"sorry"<<endl;
            }
        }
    }
    return 0;
}


hdu1871 无题 (贪心扫描)