题目
为了解人们获取新闻的来源,调查小组对N 个人进行了民意调查,其结果如下:
50 人使用电视作为新闻来源,其中包括只看电视的和结合其他新闻来源的人;
61 人不使用收音机作为新闻来源;
13 人不使用报纸作为新闻来源;
74 人至少使用至少两种方式来获取新闻。
求N 的最大值和最小值。
算法描述
不妨设总共对N 个人进行民意调查,其中以上三种方式都不适用的人数设为x ,则可以用以下表示:
电视 | 收音机 | 报纸 | 三者都不 |
50 | N-61 | N-13 | x |
由于有74 人使用至少两种方式来获取新闻,则四项相加至少重复计算了74 人(即如果有使用三种方式的人,重复计算的人数大于74 )则如上四项相加减去最小的重复计算人数74 应大于等于总数N ,即:
50+N-61+N-13+x-74≥N
由于三种方式都不适用的与通过报纸获取新闻的人数之间没有重复的,所以相加应小于等于总数N ,即:
x+N-13≤N
同理有:
x+N-61≤N
x+50≤N
当N 不断减小时,考虑到有74 人使用至少两种方式获取新闻,则电视、收音机、报纸总和至少要满足能够凑出74 人使用两种方式获取新闻,即:
50+N-61+N-13≥2×74
当N 不断增大时,考虑到四种方式的总人数会远大于N 。导致即使减去重复人数也会大于N ,造成条件的不满足。而重复人数最大的情况是,使用三种方式的有50 人,使用两种方式的有74-50 人。所以,这里的限制条件应为所有种类人数总和减去最大重复计算的人数应当小于等于总数N ,即:
50+N-61+N-13+x-2×50+74-50≤N
整理如上公式得:
N+x≥98
x≤13
x≤61
x≤N-50
N≥86
N+x≤148
由于x≤61 是x≤13 的必要条件,所以可以将x≤61 舍去;当 N≥86 且 x≤13 时,可得出x≤13<36≤N-50 ,即 x≤N-50 必然成立,所以可以将x≤N-50 舍去。
再次整理得:
N+x≥98
x≤13
N≥86
N+x≤148
所以只需对N 和x 编程,进行如上条件判定,通过循环的方式,找出N 的最大值和最小值。显然86≤N≤148 ,0≤x≤13 ,所以只需对N 在[86, 148 ],对x 在[0,13] 进行遍历。
代码实现
public class Problem1 {
private static boolean isProper(int N) {
for (int x = 0; x <= 13; x++) {//x在[0,13]进行遍历
if (N + x >= 98 && N >= 86 && N + x <= 148) {
return true;
}
}//对x进行遍历,若期间找到x,使N满足不等式,返回true
return false;//若没找到,返回false
}//对N的值是否可行进行判定,即能否找到有效的x使不等式全部成立
public static void main(String[] args) {
int Nmin = 0, Nmax = 0;
for (int N = 86; N <= 148; N++) {//N在[0,148]进行遍历
if (isProper(N)) {//当N可行时
Nmax = N;//每次发现N可行时,便将最大值更新;
if (Nmin == 0) {//若Nmin仍是初始值
Nmin = N;//即N首次找到符合条件的值,该值为最小
}
}
}
System.out.println("Nmax=" + Nmax);
System.out.println("Nmin=" + Nmin);
}
}
运行结果