雅礼集训三十天,day5

发布时间 2023-09-22 12:10:38作者: libohan0518

总结

100 + 0 + 0 + 0 = 100分
考的很垃圾(第二题调试删了但没完全删
这一场感觉是纯数学呀

T1

枚举
时间复杂度:\(O(1)\)
空间复杂度:\(O(1)\)
code:

#include<bits/stdc++.h>

using namespace std;

const int N = 15;

long double a[N];

int main(){
  a[0] = 1.0;
  for(int i = 1; i <= 9; i++){
    cin >> a[i];
  }
  a[10] = 10000.0;
  long double maxi = -1e9;
  int p;
  for(int i = 1; i <= 10; i++){
    if(maxi < a[i] * 1.0 / a[i - 1] * 1.0){
      maxi = a[i] * 1.0 / a[i - 1] * 1.0;
      p = i;
    }
  }
  cout << p;
  return 0;
}

T2

我们可已考虑将h作为分界线,分成上下两半(这样情况会少一点)
接下来可以把这题分成四类情况,分别是
1.完全覆盖
image

这只用输出长方形的面积即可
2.\(r <= min(x, y)\)
image
只用输出四分之一圆公式
3.\(r < y\)
image
这样我们可以把它给分割成一个圆环和一个三角形,至于角度,就用三角函数(atan)来求
4.以上三种都不符合
这是最复杂的一种(我就是寄在这里了)
image
我们可以把它分割成一个扇形和两个三角形,角度可以用九十度减去两个角,也可以用大角减小角(我用的是这种),角度还是用(atan)来求

接下来就是代码实现:

这题我为了把3,4融在一起,就将矩阵横着和竖着各考虑一遍,这样代码会简单很多
时间复杂度:\(O(1)\)
空间复杂度:\(O(1)\)
code:

#include <bits/stdc++.h>

using namespace std;

int h, R, W, H;

double sol(double x, double y, double r) {
  if (r <= x) {
    double th = atan(y / x);
    return th * r * r / 2;
  }
  double yy = sqrt(r * r - x * x);
  double th = atan(y / x) - atan(yy / x);
  return th * r * r / 2 + x * yy / 2;
}

double solve(double x, double y, double r) {
  if (r * r >= x * x + y * y) return x * y;
  return sol(x, y, r) + sol(y, x, r);
}

int main() {
  cin >> H >> W >> h >> R;
  cout << fixed << setprecision(4) << 1ll * H * W - (solve(h, W, R) + solve(H - h, W, R));
  return 0;
}

T3

这题我们只要推一推爆炸的规律即可AC(在线膜拜李XX大巨佬)
这题的爆炸规律是这样的:
image
根据规律,我们可以写出如下代码:
时间复杂度:\(O(n)\)
空间复杂度:\(O(1)\)
code:

#include<bits/stdc++.h>

#define int long long

using namespace std;

const int mod = 998244353;

int n, m, k, ans;

signed main() {
  cin >> n >> m >> k;
  int x = (n + 1) / 2, y = (m + 1) / 2;
  for (int i = 1; i <= x; ++i)
    if (k % i == 0 && k / i <= y) {
      int j = k / i, I = 2 * i - 1, J = 2 * j - 1;
      ans = (ans + 1ll * (n + 1 - I) * (m + 1 - J)) % mod;
      ans = (ans + 1ll * (n + 1 - I) * (m - J)) % mod;
      ans = (ans + 1ll * (n - I) * (m + 1 - J)) % mod;
      ans = (ans + 1ll * (n - I) * (m - J)) % mod;
    }
  cout << ans; 
  return 0;
}

T4

在写了