p5140大吉大利 晚上吃鸡

it2026-05-16  15

问题描述

何老板养了n只鸡(编号1到n)。何老板打算从今天开始,连续m晚都吃鸡。每晚,何老板会选一对指定编号的鸡出来。若两只鸡都活着,那么他会随便吃掉其中一只;若只有一只活着,另一只之前已经被吃了,就吃还活着那只;若两只鸡都已被吃掉了,当晚就不吃鸡。何老板想知道,m天后,可能有多少对鸡同时活着?请你帮他算一算。(如果一对鸡存活的概率>0,我们认为他们可能活着)

输入格式

第一行,两个整数n和m接下来m行,每行两个整数x和y,第i行表示第i天选出的两只鸡的编号。

输出格式

一行,一个整数,表示最后还存活的鸡的对数。

样例输入 1

3 11 2

样例输出 1

2

样例输入 2

4 31 23 42 3

样例输出 2

1

样例输入 3

3 21 21 2

样例输出 3

0

样例输入 4

10 108 92 84 64 97 82 81 83 43 42 7

样例输出 4

5

提示

2≤N≤4001≤M≤10^5

样例1说明:如果第1晚吃2,那么(1,3)这对鸡还活着如果第1晚吃1,那么(2,3)这对鸡还活着

样例2说明:(1, 4) 这对鸡活着,如果采用的是下列吃鸡方式:第1晚吃2号鸡第2晚吃3号鸡第3晚没得吃

分析 从后向前讨论,讨论假如某只鸡不死需要的条件。 那么要保证与它在一起的鸡都死亡,即之前未死。 1 // 2 #include<stdio.h> 3 #include<bits/stdc++.h> 4 using namespace std; 5 int a[100005],b[100005],dead[405],Liveset[405][405]; 6 int n,m,ans; 7 int main() 8 { 9 cin>>n>>m; 10 for(int i=1;i<=m;i++)cin>>a[i]>>b[i]; 11 for(int i=1;i<=n;i++) 12 { 13 Liveset[i][i]=1; 14 for(int j=m;j>0;j--) 15 { 16 int x=Liveset[i][a[j]]; 17 int y=Liveset[i][b[j]]; 18 if(x&&y) 19 { 20 dead[i]=true; 21 break; 22 } 23 else 24 { 25 if(x)Liveset[i][b[j]]=1; 26 if(y)Liveset[i][a[j]]=1; 27 } 28 } 29 } 30 for(int i=1;i<+n;i++) 31 { 32 if(dead[i])continue; 33 for(int j=i+1;j<=n;j++) 34 { 35 if(dead[j])continue; 36 int tmp=1; 37 for(int k=1;k<+n;k++) 38 { 39 if(Liveset[i][k]&&Liveset[j][k]) 40 { 41 tmp=0; 42 break; 43 } 44 } 45 ans+=tmp; 46 } 47 } 48 cout<<ans; 49 } 50 51 52

 

转载于:https://www.cnblogs.com/CXYscxy/p/11058870.html

相关资源:数据结构—成绩单生成器
最新回复(0)