题解:CF234D Cinema
一道非常神奇的模拟,@yuruilin2026 和@Hootime 两个大佬认为这是道水题,一眼秒了。
个人感觉只要看懂题目要干什么就很好做出来了。
题意:
输入 \(m\) 和 \(k\),表示总演员个数和 Vasya 喜欢的演员的个数;
然后输入 \(k\) 个 Vasya 喜欢的演员的编号 \(a_1\) 至 \(a_k\);
接着输入一个 \(n\),表示电影的场数;
第 \(i\) 电影的名字是 \(s_i\) (貌似并没有用),演员数为 \(d_i\),第 \(j\) 个演员的编号为 \(b_{i_j}\),特殊地,若给定的演员编号为 0 则代表小 V 忘记了这个演员的编号。
Vasya 喜欢的电影标准为这部电影中他喜欢的演员数大于等于其他电影中他喜欢的演员数。
求每部电影是不是他喜欢的电影,若是则输出 0,若不是则输出 1,若不能确定则输出 2。
思路:
简化了题意之后就很简单了,问题就被转化为如何寻找每场电影可能拥有的最多的喜欢的演员数 movie[i].max_love 和可能拥有的最少的喜欢的演员数 movie[i].min_love。
还需要找出其他电影中最少的喜欢的演员数的最大值 all_min 和最多的喜欢的演员数的最大值 all_max。
- 若
movie[i].min_love\(\ge\)all_max则输出0; - 若
movie[i].max_love\(<\)all_min则输出1; - 其他情况就输出
2。
\(\mathfrak{CODE}\):
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define fast_gets ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
#define open_f_same freopen("input.txt", "r", stdin);freopen("output.txt", "w", stdout);
#define close_f fclose(stdin);fclose(stdout);
#define max(a,b) ((a)>(b)?(a):(b))
#define min(a,b) ((a)<(b)?(a):(b))//卡常
using namespace std;
//快读快写
inline int read(){
int x = 0, f = 1;
char ch = getchar();
while (!isdigit(ch)){
if (ch == '-')
f = -1;
ch = getchar();
}
while (isdigit(ch)){
x = (x << 1) + (x << 3) + (ch ^ 48);
ch = getchar();
}
return x * f;
}
inline void write(int x){
if (x < 0) putchar('-'), x = -x;
if (x > 9) write(x / 10);
putchar(x % 10 + '0');
}
int love[114];
class cls{
public:
string name;//不知道有啥用
int d,b[114];
int max_love,min_love;//可能拥有的最多的喜欢的演员和可能拥有的最少的喜欢的演员
}movie[114];//电影
int love_op[114];
int main(){
//fast_gets
open_f_same
int m=read(),k=read();
for(int i=1;i<=k;i++){
love[i]=read();
love_op[love[i]]=1;//标记喜欢的演员的编号
}
int n=read();
for(int i=1;i<=n;i++){
cin>>movie[i].name;
movie[i].d=read();
for(int j=1;j<=movie[i].d;j++){
movie[i].b[j]=read();
if(love_op[movie[i].b[j]]){//如果是喜欢的演员,所以可以确定,最多和最少都加
movie[i].max_love++;
movie[i].min_love++;
}else if(movie[i].b[j]==0){//如果不知道,那么只加最多的
movie[i].max_love++;
}
}
movie[i].max_love=min(movie[i].max_love,k);//不能超出k
movie[i].min_love=max(movie[i].min_love,k-m+movie[i].d);//若喜欢的演员-总演员+这场电影的演员>最少的,则说明肯定有几个不知道的演员可以确定是喜欢的
}
for(int i=1;i<=n;i++){
int all_max=-114514,all_min=-114514;//设为最小值(一定要放在循环里面)
for(int j=1;j<=n;j++){//当j!=i时更新最大值和最小值
if(j==i) continue;
all_min=max(all_min,movie[j].min_love);
all_max=max(all_max,movie[j].max_love);
}
if(movie[i].min_love>=all_max){//若这场电影的最小值都大于或等于其他电影最大值的最大值,那么就可以确定这场电影一定是喜欢的
cout<<0<<endl;
}
else if(movie[i].max_love<all_min){//若这场电影的最大值都小于其他电影小值的最大值,那么就可以确定这场电影一定不是喜欢的
cout<<1<<endl;
}
else cout<<2<<endl;//否则不能确定
}
close_f
return 0;
}
完结撒花!!!

浙公网安备 33010602011771号