百度这套题还是有点水的,除了最后一题是个简单的动态规划,需要注意下细节。
题目链接:[点这儿].
第一题:罪犯转移
题目:
C市现在要转移一批罪犯到D市,C市有
n
名罪犯,按照入狱时间有顺序,另外每个罪犯有一个罪行值,值越大罪越重。现在为了方便管理,市长决定转移入狱时间连续的c
名犯人,同时要求转移犯人的罪行值之和不超过t
,问有多少种选择的方式?
解析:
枚举就好了,先计算前
c
个数的和sum
,往后计算的时候就只需要加上当前值,减去距离当前值为c
的数就行了.
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
int n, t, c;
while (cin >> n >> t >> c) {
vector<LL> arr(n);
LL sum = 0;
for (int i = 0; i < n; i++)
cin >> arr[i], sum += i < c ? arr[i] : 0;
int ans = sum <= t ? 1 : 0;
for (int i = c; i < n; i++)
sum = sum - arr[i - c] + arr[i], ans += sum <= t ? 1 : 0;
cout << ans << endl;
}
return 0;
}
第二题:裁减网格纸
题目:
度度熊有一张网格纸,但是纸上有一些点过的点,每个点都在网格点上,若把网格看成一个坐标轴平行于网格线的坐标系的话,每个点可以用一对整数
x,y
来表示。度度熊必须沿着网格线画一个正方形,使所有点在正方形的内部或者边界。然后把这个正方形剪下来。问剪掉正方形的最小面积是多少。
解析:
维护
x,y
的最大最小值就好了,最后取边长最大的边长,注意下数据范围就可以过了.
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const int INF = 0x3f3f3f3f;
int main()
{
int n;
while (cin >> n) {
int x, y;
int minX = INF, minY = INF, maxX = -INF, maxY = -INF;
for (int i = 0; i < n; i++) {
cin >> x >> y;
minX = min(minX, x);
minY = min(minY, y);
maxX = max(maxX, x);
maxY = max(maxY, y);
}
LL l = max(0LL + maxX - minX, 0LL + maxY - minY);
cout << l * l << endl;
}
return 0;
}
第三题:钓鱼比赛
题目:
ss请cc来家里钓鱼,鱼塘可划分为
n*m
的格子,每个格子有不同的概率钓上鱼,cc一直在坐标(x,y)
的格子钓鱼,而ss每分钟随机钓一个格子。问t
分钟后他们谁至少钓到一条鱼的概率大?为多少?
解析:
简单的概率计算题,首先算出ss在每分钟能钓到鱼的概率( ∑ni=1∑mj=1arr[i]n∗m );
问的是
t
分钟后至少钓到一条鱼的概率,那么我们就反向计算出t
分钟后没有钓到鱼的概率,由于每分钟钓没钓到鱼是独立事件,因此设钓到鱼的概率为 p ,那么t
分钟后至少钓到一条鱼的概率为1−(1−p)t 。注意浮点数比较大小的写法就行了.
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
const double eps = 1e-9;
int main()
{
int n, m, x, y, t;
while (cin >> n >> m >> x >> y >> t) {
vector<vector<double> > mp(n, vector<double>(m));
double ss = 0;
for (int i = 0; i < n; i++)
for (int j = 0; j < m; j++)
cin >> mp[i][j], ss += mp[i][j];
double cc = mp[x - 1][y - 1];
ss /= (1.0 * n * m);
if (fabs(ss - cc) < eps) {
puts("equal");
printf("%.2f\n", 1 - pow(1 - cc, 1.0 * t));
} else if (ss - cc > eps) {
puts("ss");
printf("%.2f\n", 1 - pow(1 - ss, 1.0 * t));
} else {
puts("cc");
printf("%.2f\n", 1 - pow(1 - cc, 1.0 * t));
}
}
return 0;
}