社区讨论
求调玄关,马蜂良好USACO题目
灌水区参与者 1已保存回复 1
讨论操作
快速查看讨论及其快照的属性,并进行相关操作。
- 当前回复
- 1 条
- 当前快照
- 1 份
- 快照标识符
- @m2ev6boy
- 此快照首次捕获于
- 2024/10/18 23:07 去年
- 此快照最后确认于
- 2025/11/04 16:53 4 个月前
题目描述
农场主约翰以其农场生产的牛奶质量闻名遐迩,他正在为他的N个最好的朋友(1≤N≤50)举办一场牛奶品鉴会。不幸的是,派对上出现的M种牛奶(1≤M≤50)中,有一种已经变质,但农夫John不知道是哪一种!任何人喝了变质的牛奶都会生病,无论是在晚会的剩余时间还是之后。
你会收到一份派对记录——谁在什么时候喝奶,谁在什么时候生病。根据这些信息,你可以推断出哪一种牛奶可能是坏的。利用这一知识,帮助农民约翰确定他将需要准备的最低剂量的药物,以确保他能治愈所有生病的人,无论是在聚会期间或之后。
输入
输入的第一行包含整数N、M、D和S。
接下来的D行(1≤D≤1000)每一行包含三个整数p,m,t,表示p在t时刻喝了牛奶m, p的值在1…N范围内,m在1…M范围内,t在1…100范围内。一个人可以多次喝同一种牛奶,也可以在同一时间点喝好几种类型的牛奶。
接下来的S行(1≤S≤N)每一行包含两个整数p,t,表示人p在t时刻患病,p的值在1…N范围内,t在1…100范围内。每个人最多会生病一次,而他们之所以会生病,只是因为他们在严格意义上更早的某个时间点喝了变质的牛奶。
输出
一个单一的整数,表示农民约翰需要准备的最小剂量,这样他就可以保证他将有足够多的剂量来治疗所有生病的人,无论是在聚会期间还是之后。
样例输入
3 4 7 2
1 1 1
1 4 1
1 3 4
1 2 2
3 1 3
2 1 5
2 2 7
1 3
2 8
样例输出
3
提示
有3个人和4种类型的牛奶。1号在时间3生病,2号在时间8生病。3号在聚会上没有生病,尽管如此,我们仍然需要考虑他在聚会结束后生病的可能性。让我们一个一个地考虑牛奶的种类,看看哪些会变质;我们知道,如果每个患病的人在患病前都喝这种类型的牛奶,那么这种类型的牛奶可能是有害的。
牛奶1:两个病人(1和2)在生病前都喝了这种牛奶,所以这可能是坏牛奶。如果是这样的话,3也喝了,所以一共会导致3个人生病(3会在聚会后生病)。
牛奶2:两个生病的人在生病前都喝了这种牛奶,所以这也可能是坏牛奶。没有其他人喝这种牛奶,所以最坏情况下,如果这是坏牛奶,总共有两个人会生病。
牛奶3:这不可能是坏牛奶,因为1号人在生病前没有喝——1号在时间4喝了牛奶3,但是1号是在时间3生病的,如果牛奶3与1号患病有关,那么1号最迟需要在时间2之前喝。
牛奶4:这不可能是坏牛奶,因为2号没有喝,但2号生病了。
因此,答案是农民约翰必须获得3剂药,因为如果牛奶1是坏的,那么总共需要3个人被治愈。
CPP#include<bits/stdc++.h>
using namespace std;
struct find{
int p,m,t;
}a[105];
struct ff{
int p2,m2,t2;
}b[105];
bool pan[205];
int n,m,d,s;
int ans=0;
int ans2=-0x3f3f3f;
int main(){
cin>>n>>m>>d>>s;
for(int i=1;i<=n;i++){
cin>>a[i].p>>a[i].m>>a[i].t;
}
for(int i=1;i<=m;i++){
cin>>b[i].p2>>b[i].m2>>b[i].t2;
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(b[j].p2==a[i].p&&a[i].t<=b[j].t2){
pan[j]=true;
}
// else{
// pan[j]=false;
// }
}
}
for(int i=1;i<=m;i++){
// cout<<1;
if(pan[i]==true){
// cout<<1;
for(int j=1;j<=n;j++){
if(a[j].p==b[i].p2){
// cout<<2;
ans++;
}
}
}
ans2=max(ans2,ans);
}
cout<<ans2;
}
回复
共 1 条回复,欢迎继续交流。
正在加载回复...