question 1 警察局抓了 a,b,c,d 四名偷窃嫌疑犯,其中只有一人是小偷。
审问中,a说:我不是小偷;b说:c是小偷;c说:小偷肯定是d;d说:c冤枉人。
现在已经知道有3人说真话,一人说假话,问谁是小偷;
* anaysis:将小偷进行编号,枚举尝试所有的人,满足条件即是小偷。
/** question 1 警察局抓了 a,b,c,d 四名偷窃嫌疑犯,其中只有一人是小偷。审问中,a说:我不是小偷;b说:c是小偷;c说:小偷肯定是d;d说:c冤枉人。* 现在已经知道有3人说真话,一人说假话,问谁是小偷;* anaysis:将小偷进行编号,枚举尝试所有的人,满足条件即是小偷。* param* return**/
/**< *//**
#include <iostream>using namespace std;int main()
{int thief='a';for(thief='a';thief<='d';++thief)if(((thief!='a')+(thief=='c')+(thief=='d')+(thief!='d'))==3)printf("%c is thiefn",thief);return 0;
}
*/
/** question 2:3位老师对某次数学竞赛进行了预测,他们的预测如下:
甲说:a得了第一名,b得了第三名;
乙说:c得了第一名,d得了第四名;
丙说:d得了第二名,a得了第三名。
竞赛结果表明,他们都只说对了一半,并且并无并列名次,输出学生们的名次
*
* anaysis :对abcd各进行1234枚举,可用三重循环实现,最后的d用d=10-a-b-c;
/** question 2:3位老师对某次数学竞赛进行了预测,他们的预测如下:甲说:a得了第一名,b得了第三名;乙说:c得了第一名,d得了第四名;丙说:d得了第二名,a得了第三名。竞赛结果表明,他们都只说对了一半,并且并无并列名次,输出学生们的名次** anaysis :对abcd各进行1234枚举,可用三重循环实现,最后的d用d=10-a-b-c;* * return**/#include <iostream>
#include <cstdio>using namespace std;int main()
{int a,b,c,d;for(a=1;a<5;++a)for(b=1;b<5;++b)if(b!=a)for(c=1;c<5;++c)if(c!=a&&c!=b){d=10-a-b-c;if(((a==1)+(b==3)==1)&&((c==1)+(d==4)==1)&&((d==2)+(a==3)==1))printf("a 是 %dthnb 是 %dthnc 是 %dthnd 是 %dthn",a,b,c,d);}return 0;
}
problem 3:
PAT(乙级)2022年夏季考试
7-4 今天是周几
分数 20
作者 陈越
单位 浙江大学
韩梅梅和李雷在吵吵今天是周几,他们的对话如下:
韩梅梅:今天是周五。
李雷:不对!今天是周六。
韩梅梅:但昨天是周三呀。
李雷:不可能!昨天是周四。
韩梅梅:那明天是周二了吧。
李雷:搞笑吗?明天是周一。
他俩的妈妈告诉你,每个熊孩子都只说对了一句话,就请你判断一下,今天到底是周几?
输入包含 2 行,每行给出一个熊孩子的声明,格式如下:
昨天 今天 明天
这里的日期是 0 到 6 的整数,依次对应周日到周六。
首先第一行输出“今天”是周几,要求输出其英文名称(对照表在样例之后给出)。输入保证每个熊孩子都只说对了一句话,“今天”的答案存在并且是唯一的。
随后 2 行依次打印出每个熊孩子答对的那天 —— 是昨天
就输出 yesterday
,或者是今天
要输出 today
,或者是明天
要输出 tomorrow
。
3 5 2
4 6 1
Friday
today
yesterday
注意: 日期的英文名称对照如下
周日:0 - Sunday
周一:1 - Monday
周二:2 - Tuesday
周三:3 - Wednesday
周四:4 - Thursday
周五:5 - Friday
周六:6 - Saturday
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
总共写了三个代码:第一个代码我是一辈子都不想再写了。
coding first:判断第二个熊孩子说真话的天数是哪一天,可真不好判断,可谓是心力交瘁,第二个程序好写许多,这个可以直接不用看,属于是把给斗都出来的。
/**判断第二个熊孩子说真话的天数是哪一天,可真不好判断,可谓是心力交瘁,第二个程序好写许多
*//**
#include <iostream>
#include <map>
#include <string>
using namespace std;int main()
{int ch[2][3];for(int i=0;i<2;++i)for(int j=0;j<3;++j)scanf("%d",&ch[i][j]);int index=0;for(int i=-1;i<2;++i){int yes=ch[0][i+1];if((((yes-ch[0][0])%7==i+1)+((yes-ch[0][1])%7==i)+((yes-ch[0][2])%7==i-1))==1&&(((yes-ch[1][0])%7==i+1)+((yes-ch[1][1])%7==i)+((yes-ch[1][2])%7==i-1)==1))index=i+1;}map<int,string> mp={{0,"Sunday"},{1,"Monday"},{2,"Tuesday"},{3,"Wednesday"},{4,"Thursday"},{5,"Friday"},{6,"Saturday"}};int day=ch[0][index];if(index==0)cout << mp[(day+1)%7] << endl;else if(index==1)cout << mp[day] << endl;else cout << mp[(day-1)%7] << endl;map<int,string> str{{0,"yesterday"},{1,"today"},{2,"tomorrow"}};for(int i=0;i<3;++i)if(i==index){cout << str[i] << endl;}for(int i=0;i<3;++i){if(index<=i) //根据第一个熊孩子所说的真话,推出第二个熊孩子所说的真话{//if语句只可能是(5,0),(6,0)(6,1)才会进入;//因为(index-i)%7只可能等于5,6,0((day-ch[1][i])%7不可能等于0),所以0可以排除if(day>ch[1][i] && (day-ch[1][i])%7==(index-i)%7)//如果第一个熊孩子说的真话是昨天且是周五cout << str[i] << endl; //或者周六来判断第二个孩子说的真话是哪一天else if((day <= ch[1][i]) && day-ch[1][i]==index-i)cout << str[i] << endl;}else if(index>i && ((day-ch[1][i])%7==index-i))cout << str[i] << endl;}return 0;
}
*/
coding second :因为题目说了每个熊孩子只说对一句话,我们可以用找第一个熊孩子说真话的同样的方法去找出第二个熊孩子说的真话的下标
/**再写:因为题目说了每个熊孩子只说对一句话,我们可以用找第一个熊孩子说真话的同样的方法去找出第二个熊孩子说的真话的下标*/
/**
#include <iostream>
#include <map>
#include <string>
using namespace std;int main()
{int ch[2][3];for(int i=0;i<2;++i)for(int j=0;j<3;++j)scanf("%d",&ch[i][j]);int index=0;for(int i=-1;i<2;++i){int yes=ch[0][i+1];if((((yes-ch[0][0])%7==i+1)+((yes-ch[0][1])%7==i)+((yes-ch[0][2])%7==i-1))==1&&(((yes-ch[1][0])%7==i+1)+((yes-ch[1][1])%7==i)+((yes-ch[1][2])%7==i-1)==1))index=i+1; //因为题目说了每个熊孩子只说对一句话,可以找出第一个熊孩子说的真话} //的下标map<int,string> mp={{0,"Sunday"},{1,"Monday"},{2,"Tuesday"},{3,"Wednesday"},{4,"Thursday"},{5,"Friday"},{6,"Saturday"}};int day=ch[0][index];if(index==0)cout << mp[(day+1)%7] << endl;else if(index==1)cout << mp[day] << endl;else cout << mp[(day-1)%7] << endl;map<int,string> str{{0,"yesterday"},{1,"today"},{2,"tomorrow"}};for(int i=0;i<3;++i)if(i==index){cout << str[i] << endl;}for(int i=-1;i<2;++i){int yes=ch[1][i+1];if((((yes-ch[0][0])%7==i+1)+((yes-ch[0][1])%7==i)+((yes-ch[0][2])%7==i-1))==1&&(((yes-ch[1][0])%7==i+1)+((yes-ch[1][1])%7==i)+((yes-ch[1][2])%7==i-1)==1))index=i+1; //因为题目说了每个熊孩子只说对一句话,我们可以用找第一个熊孩子说} //真话的同样的方法去找出第二个熊孩子说的真话的下标for(int i=0;i<3;++i)if(i==index){cout << str[i] << endl;}return 0;
}
*/
coding thirt:突然想到还有另外一种解法,先假设今天的日期是(0~6),然后用两个熊孩子的话判断是否为真;
/**突然想到还有另外一种解法,先假设今天的日期是(0~6),然后用两个熊孩子的话判断是否为真;*/#include <iostream>
#include <map>
#include <string>
using namespace std;int main()
{map<int,string> date={{0,"Sunday"},{1,"Monday"},{2,"Tuesday"},{3,"Wednesday"},{4,"Thursday"},{5,"Friday"},{6,"Saturday"}};map<int,string> true_word{{0,"yesterday"},{1,"today"},{2,"tomorrow"}};int ch[2][3];for(int i=0;i<2;++i)for(int j=0;j<3;++j)scanf("%d",&ch[i][j]);int today=0;for(today =0;today<7;++today){if(((((today-ch[0][0])%7==1)+((today-ch[0][1])==0)+((today-ch[0][2])%7==6))==1)&&(((today-ch[1][0])%7==1)+((today-ch[1][1])==0)+((today-ch[1][2])%7==6))==1)break;}cout << date[today] << endl;int index=0;for(int k=0;k<2;++k){for(int i=0;i<3;++i)if(((today-ch[k][i])%7)==(1-i)%7)index=i;cout << true_word[index] << endl;}
}
prlblem 4:
1089 狼人杀-简单版
分数 20
作者 CHEN, Yue
单位 浙江大学
以下文字摘自《灵机一动·好玩的数学》:“狼人杀”游戏分为狼人、好人两大阵营。在一局“狼人杀”游戏中,1 号玩家说:“2 号是狼人”,2 号玩家说:“3 号是好人”,3 号玩家说:“4 号是狼人”,4 号玩家说:“5 号是好人”,5 号玩家说:“4 号是好人”。已知这 5 名玩家中有 2 人扮演狼人角色,有 2 人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎。扮演狼人角色的是哪两号玩家?
本题是这个问题的升级版:已知 N 名玩家中有 2 人扮演狼人角色,有 2 人说的不是实话,有狼人撒谎但并不是所有狼人都在撒谎。要求你找出扮演狼人角色的是哪几号玩家?
输入在第一行中给出一个正整数 N(5≤N≤100)。随后 N 行,第 i 行给出第 i 号玩家说的话(1≤i≤N),即一个玩家编号,用正号表示好人,负号表示狼人。
如果有解,在一行中按递增顺序输出 2 个狼人的编号,其间以空格分隔,行首尾不得有多余空格。如果解不唯一,则输出最小序列解 —— 即对于两个序列 A=a[1],...,a[M] 和 B=b[1],...,b[M],若存在 0≤k<M 使得 a[i]=b[i] (i≤k),且 a[k+1]<b[k+1],则称序列 A 小于序列 B。若无解则输出 No Solution
。
5
-2
+3
-4
+5
+4
1 4
6
+6
+3
+1
-5
-2
+4
1 5
5
-2
-3
-4
-5
-1
No Solution
代码长度限制
16 KB
时间限制
400 ms
内存限制
64 MB
coding :这个代码应该是看的柳神的:
#include <iostream>
#include <vector>
#include <cmath>
using namespace std;int main()
{int n;cin >> n;vector<int> vec(n+1);for(int i=1;i<=n;++i)cin >> vec[i];for(int i=1;i<n;++i) //最开始的两层for循环枚举狼人编号{for(int j=i+1;j<=n;++j){vector<int> goodman(n+1,1),lie; // lie存储说谎话的人的编号goodman[i]=goodman[j]=-1; //假设i和j是狼人for(int k=0;k<=n;++k){if(vec[k]*goodman[abs(vec[k])]<0) //如果k号人说的话与说的话指定的人的真实身份lie.push_back(k); //不符合则此人说了谎话}if(lie.size()==2&&goodman[lie[0]]+goodman[lie[1]]==0) //如果说谎话的人刚好两个{cout << i << ' ' << j << endl; //且一个人是狼人,一个是好人,则找到了答案return 0;}}}cout << "No Solutionn" ; //如果都没有找到,则没有解return 0;
}
本文发布于:2024-02-02 18:33:45,感谢您对本站的认可!
本文链接:https://www.4u4v.net/it/170687018245665.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
留言与评论(共有 0 条评论) |