题目1
5位运动员参加了10米台跳水比赛,有人让他们预测比赛结果
A选手说:B第二,我第三;
B选手说:我第二,E第四;
C选手说:我第一,D第二;
D选手说:C最后,我第三;
E选手说:我第四,A第一:
比赛结束后,每位选手都说对了一半,请编程确定比赛的名次
#include <bits/stdc++.h>
using namespace std;
int rka, rkb, rkc, rkd, rke;
bool truea, trueb, truec, trued, truee;
int main()
{
for(rka=1; rka<=5; ++rka){ //枚举A可能的名次
for(rkb=1; rkb<=5; ++rkb){ //枚举B可能的名次
for(rkc=1; rkc<=5; ++rkc){ //枚举C可能的名次
for(rkd=1; rkd<=5; ++rkd){ //枚举D可能的名次
for(rke=1; rke<=5; ++rke){ //枚举E可能的名次
truea=(rkb==2 && rka!=3) || (rkb!=2 && rka==3); //一真一假两种取或, 最后必然要为真
trueb=(rkb==2 && rke!=4) || (rkb!=2 && rke==4); //一真一假两种取或, 最后必然要为真
truec=(rkc==1 && rkd!=2) || (rkc!=1 && rkd==2); //一真一假两种取或, 最后必然要为真
trued=(rkc==5 && rkd!=3) || (rkc!=5 && rkd==3); //一真一假两种取或, 最后必然要为真
truee=(rke==4 && rka!=1) || (rke!=4 && rka==1); //一真一假两种取或, 最后必然要为真
if(truea && trueb && truec && trued && truee){ //五个人说的两句话都是一真一家
if(rka!=rkb && rka!=rkc && rka!=rkd && rka!=rke){ //A和其他四个人的排名都不相同
if(rkb!=rkc && rkb!=rkd && rkb!=rke){ //B和剩余三个人的排名都不相同
if(rkc!=rkd && rkc!=rke){ //C和剩余两个人的排名都不相同
if(rkd!=rke){ //D和剩余一个人的排名不相同
cout << "A: " << rka << endl;
cout << "B: " << rkb << endl;
cout << "C: " << rkc << endl;
cout << "D: " << rkd << endl;
cout << "E: " << rke << endl;
}
}
}
}
}
}
}
}
}
}
return 0;
}
题目2
日本某地发生了一件谋杀案,警察通过排查确定杀人凶手必为4个嫌疑犯的一个
以下为4个嫌疑犯的供词
A说:不是我。
B说:是C。
C说:是D。
D说:C在胡说
已知3个人说了真话,1个人说的是假话。
现在请根据这些信息,写一个程序来确定到底谁是凶手
#include <bits/stdc++.h>
using namespace std;
int a, b, c, d;
int main()
{
for(a=0; a<=1; ++a){ //a是否是凶手
for(b=0; b<=1; ++b){ //b是否是凶手
for(c=0; c<=1; ++c){ //c是否是凶手
for(d=0; d<=1; ++d){ //d是否是凶手
//按每个人说的都是真话计算, 加起来等于3, 并且只有一个是凶手
if(!a+c+d+!d==3 && a+b+c+d==1){
if(a){
cout << "A 是凶手" << endl;
}
if(b){
cout << "B 是凶手" << endl;
}
if(c){
cout << "C 是凶手" << endl;
}
if(d){
cout << "D 是凶手" << endl;
}
}
}
}
}
}
return 0;
}
[GESP202312 四级] 田忌赛马
#include <bits/stdc++.h>
using namespace std;
int n, u[50010], v[50010], tagu, tagv, ans;
int main()
{
scanf("%d", &n);
for(int i=1; i<=n; ++i){
scanf("%d", &u[i]);
}
for(int i=1; i<=n; ++i){
scanf("%d", &v[i]);
}
sort(u+1, u+n+1);
sort(v+1, v+n+1);
tagu=n;
tagv=n;
while(tagu>0 && tagv>0){
if(u[tagu]>v[tagv]){
tagu--;
tagv--;
ans++;
}
else{
tagv--;
}
}
printf("%d", ans);
return 0;
}