分析:
贪心算法。
有 \(n\) 个客人。对于每一位客人,我们都要遍历一遍所有房间,找出最优入住房间编号。
设当前遍历的房间编号为 \(j\)。
分三种情况:
- 左右两边的房间皆空,则为最优房间。
- 左右两边只有一个房间有客人,则愤怒值加 \(2\)(因为有两个客人所以加 \(2\))。
- 左右两边都有人住,则为最坏情况,愤怒值加 \(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;
}
标签:酒店,P9585,int,题解,房间,值加,两边,愤怒,客人
From: https://www.cnblogs.com/splay/p/17661008.html