A29784. 构造性证明
填空题
中等
知识点
题目描述
构造性证明
题目描述
关于数学定理证明,也有高下之分。最暴力的证明方法是“构造性证明”,即当需要证明某种解存在时,直接把解构造出来,而不是仅通过推理证明解之存在。
下面有一个定理:
设ai(i=1,...,5)均为正实数。则一定存在4个互不相同的下标 i、j、k、l,使得|ai/aj - ak/al|<1/2。
作为程序员,就请你编写程序构造出正确的下标,验证这个结论。
输入
输入一行中顺序给出5个正实数。为保证计算中不产生浮点溢出,我们令输入的数字在[10^-10,10^10]区间内,且小数点不超过10位小数。
输出
在一行中首先输出使得定理结论成立的下标有多少套,随后输出最小的一套下标。数字间以1个空格分隔,行尾不得有多余空格。
输入样例
3.12 5.27 0.0007 9825.4413 10
输出样例
18 1 4 3 2
参考答案
#include <iostream>
using namespace std;
int main(){ //《构造性证明》 枚举题
double a[10];
for(int i=1;i<=5;i++){
cin>>a[i];
}
int cnt=0;
int ai,aj,ak,al;
for(int i=1;i<=5;i++){ //i
for(int j=1;j<=5;j++){ //j
for(int k=1;k<=5;k++){ //k
for(int l=1;l<=5;l++){ //l
//两两之间各不相等
if(i!=j && i!=k && i!=l && j!=k && j!=l && k!=l){
double ans=a[i]/a[j] - a[k]/a[l];
//符合条件 找到答案
if(ans>=0&&ans<1.0/2 || ans<0&&ans*-1<1.0/2){
if(cnt==0) //第一次找到即为最小
ai=i,aj=j,ak=k,al=l;
cnt++;
}
}
}
}
}
}
cout<<cnt<<' '<<ai<<' '<<aj<<' '<<ak<<' '<<al;
}
上一题
下一题