试题A:跑步训练
【问题描述】
小明要做一个跑步训练。
初始时,小明充满体力,体力值计为10000。如果小明跑步,每分钟损耗600的体力。如果小明休息,每分钟增加300的体力。体力的损耗和增加都是均匀变化的。
小明打算跑一分钟、休息一分钟、再跑一分钟、再休息一分钟……如此循环。如果某个时刻小明的体力到达0,他就停止锻炼。
请问小明在多久后停止锻炼。为了使答案为整数,请以秒为单位输出答案。答案中只填写数,不填写单位。
答案:3880
#include<iostream>
using namespace std;
int main()
{
int n = 10000;
int s = 10, t = 5;
double res = 0;
while (n>0) {
n -= 600;
res++;
if (n > 0)
{
n += 300;
res++;
}
else {
res--;
n += 600;
break;
}
}
res =res*60 + (double)n / s;
cout << (int)res << endl;
system("pause");
return 0;
}
试题B:纪念日
【问题描述】
2020年7月1日是中国共产党成立99周年纪念日。中国共产党成立于1921年7月23日。
请问从1921年7月23日中午12时到2020年7月1日中午 12时一共包含多少分钟?
答案:52038720
方法一:
利用excel表格计算相差天数,进而求得题目中所求答案
方法二:
- 公历闰年判定遵循的规律为:四年一闰,百年不闰,四百年再闰。
#include<iostream>
using namespace std;
struct Date {
int y;
int m;
int d;
};
int isLeap(int y)
{
return y % 4 == 0 && y % 100 != 0 || y % 400 == 0;
}
int daysOfMonth(Date d)
{
int days[12] = { 31,0,31,30,31,30,31,31,30,31,30,31 };
if (d.m != 2)
return days[d.m - 1];
else
return 28 + isLeap(d.y);
}
int daysOfDate(Date d)
{
int days = 0;
for (int y = 1; y <= d.y; y++)
days += 365 + isLeap(y);
for (int m = 1; m < d.m; m++)
days += daysOfMonth(d);
days += d.d;
return days;
}
int main()
{
Date d1, d2;
cout << "Input 2 days days(yyyy mm dd):" << endl;
cin >> d1.y >> d1.m >> d1.d;
cout << d1.y << "-" << d1.m << "-" << d1.d << endl;
int days1 = daysOfDate(d1);
cout << "days1=" << days1 << endl;
cin >> d2.y >> d2.m >> d2.d;
cout << d2.y << "-" << d2.m << "-" << d2.d << endl;
int days2 = daysOfDate(d2);
cout << "days2=" << days2 << endl;
cout << "days distance is " << fabs(days1 - days2) << endl;
system("pause");
return 0;
}
所以结果为:36138×24×60=52038720
试题C:合并检测
【问题描述】
新冠疫情由新冠病毒引起,最近在A国蔓延,为了尽快控制疫情,A国准备给大量民众进病毒核酸检测。
然而,用于检测的试剂盒紧缺。
为了解决这一困难,科学家想了一个办法:合并检测。即将从多个人(k个)采集的标本放到同一个试剂盒中进行检测。如果结果为阴性,则说明这k个人都是阴性,用一个试剂盒完成了k 个人的检测。如果结果为阳性,则说明至少有一个人为阳性,需要将这k个人的样本全部重新独立检测(从理论上看,如果检测前k-1个人都是阴性可以推断出第k个人是阳性,但是在实际操作中不会利用此推断,而是将k个人独立检测),加上最开始的合并检测,一共使用了k+1个试剂盒完成了k个人的检测。
A国估计被测的民众的感染率大概是1%,呈均匀分布。请问k取多少能最节省试剂盒?
答案:10
#include<iostream>
#include<cmath>
using namespace std;
int main()
{
int n = 100;//假设总共有100人
int sum = 0,min=INT_MAX,res;
for (int k = 1; k <= n; k++)
{
if (100 % k == 0)
sum = 100 / k + k;
else
sum = 100 / k + 1 + k;
if (sum < min)
{
min = sum;
res = k;
}
}
cout << res << endl;
system("pause");
return 0;
}
试题D:PEPEAT程序
#include<iostream>
using namespace std;
int main()
{
int A = 0;
for (int i = 0; i < 2; i++)
{
A += 4;
for (int j = 0; j < 5; j++)
{
for (int k = 0; k < 6; k++)
A += 5;
A += 7;
}
A += 8;
}
A += 9;
cout << "A:" << A << endl;
system("pause");
return 0;
}
(算出来结果为403,有问题,请各位小伙伴指出)
试题F:整除序列
#include<iostream>
using namespace std;
typedef long long ll;
int main()
{
ll n;
cin >> n;
while (n > 0)
{
cout << n << " ";
n /= 2;
}
cout << endl;
system("pause");
return 0;
}
试题G:解码
【评测用例规模与约定】
对于所有评测用例,字符串由大小写英文字母和数字组成,长度不超过100。
请注意原来的串长度可能超过100。
#include<iostream>
#include<string>
using namespace std;
int main()
{
string str;
//getline(cin, str);
cin >> str;
int n = str.length();
string newstr;
for (int i = 0; i < n-1; i++)
{
char ch = str[i + 1];
if (ch-'0' > 0&&ch-'0' < 10)
{
for (int j = 0; j < ch - '0'; j++)
newstr += str[i];
i++;
}
else
newstr += str[i];
}
cout << newstr << endl;
system("pause");
return 0;
}
试题H:走方格
典型的动态规划问题:
#include<iostream>
using namespace std;
const int N = 35;
int dp[N][N];
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
dp[i][1] = 1;
for (int i = 1; i <= m; i++)
dp[1][i] = 1;
for (int i = 2; i <= n; i++)
for (int j = 2; j <= m; j++)
if (i % 2 == 0 && j % 2 == 0)
dp[i][j] = 0;
else
dp[i][j] = dp[i - 1][j] + dp[i][j - 1];
cout << dp[n][m] << endl;
system("pause");
return 0;
}
试题I:整数拼接
#include<iostream>
#include<string>
using namespace std;
const int N = 100010;
int a[N];
int connect(int x,int y)
{
int t = y;
while (t)
{
x *= 10;
t /= 10;
}
x += y;
return x;
}
int main()
{
int n, k;
cin >> n >> k;
for (int i = 1; i <= n; i++)
cin >> a[i];
int res = 0;
for (int i = 1; i <= n; i++)
{
for (int j = i+1; j <= n; j++)
{
int s = a[i], t = a[j];
if (connect(s, t) % k == 0)
res++;
if (connect(t, s) % k == 0)
res++;
}
}
cout << res << endl;
system("pause");
return 0;
}
试题J:网络分析
#include<iostream>
using namespace std;
const int N = 10010;
int p[N], d[N];
int find(int x)
{
if (p[x] == x || p[p[x]] == p[x])
return p[x];
int r = find(p[x]);
d[x] += d[p[x]];
p[x] = r;
return r;
}
int main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
p[i] = i;
while (m--)
{
int t, a, b;
cin >> t >> a >> b;
if (t == 1)
{
a = find(a), b = find(b);
if (a != b)
{
d[a] -= d[b];
p[a] = b;
}
}
else {
a = find(a);
d[a] += b;
}
}
for (int i = 1; i <= n; i++)
if (i == find(i))
cout << d[i] << " ";
else
cout << d[i] + d[find(i)] << " ";
cout << endl;
system("pause");
return 0;
}
欢迎各位小伙伴提出看法建议