P9585 酒店题解

发布时间 2023-08-27 22:32:35作者: S__X

分析:

贪心算法。

\(n\) 个客人。对于每一位客人,我们都要遍历一遍所有房间,找出最优入住房间编号。

设当前遍历的房间编号为 \(j\)

分三种情况:

  1. 左右两边的房间皆空,则为最优房间。
  2. 左右两边只有一个房间有客人,则愤怒值加 \(2\)(因为有两个客人所以加 \(2\))。
  3. 左右两边都有人住,则为最坏情况,愤怒值加 \(4\) (中间的客人愤怒值加 \(2\),左右两边客人愤怒值加 \(1\))。

\(n\) 个客人,所以要进行 \(n\) 次循环。

代码:

#include<bits/stdc++.h>
using namespace std;
int n,m,sum,f[105];
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++) {
		int k=0x3f,I=0;//k为愤怒值,初始化,I为客人入住的房间编号
		for(int j=1;j<=m;j++) {
			int fr=j-1,en=j+1;
			if(j==1) fr=m;//因为是环形,所以要特别处理一下
			if(j==m) en=1;
			if(f[j]==0) {//如果当前房间没有人入住
				int K=0;
				if(f[fr]==1) K+=2;//相邻的房间只有一个人入住
				if(f[en]==1) K+=2;//相邻的房间有两个人入住
				if(K<k) {
					k=K;
					I=j;
				}
			}
		}
		sum+=k;
		f[I]=1;//标记
	}
	cout<<sum<<endl;
	return 0;
}