警告:抄代码者 \(\text{CE}\)

0x01 乘方

题目大意

给定 \(a\)\(?b\)\(a^b\) 的值,若 \(a^b > 10^9\) ,输出 \(-1\)

思路

使用 int 即可,如果 \(a^b\) 超出 int 范围会得到负数,这点需要特判。

\(\mathfrak{Code\,Here}\)

#include <bits\stdc++.h>

int main()
{
    int a, b, ans;

    scanf("%d %d", &a, &b);
    
    ans = pow(a, b);
    
    if(ans >= 1 && ans <= 1e9)
    {
        printf("%d", ans);
    }
    else
    {
        printf("%d", -1);
    }

    return 0;
}

0x02 解密

题目大意

题面已经很简洁了。

思路

以下 \(n = n_i,d=d_i,e=e_i\)

\(ed = (p - 1)(q - 1) + 1\)

\(ed = p(q - 1) - (q-1)\)

\(ed = pq-p-q+1\)

带入 \(n=pq\)

\(ed=n-p-q+1\)

我们考虑题目中的 \(m\),我们把式子变成

\(p+q=n-ed+2\)

现在我们有两个式:

  1. \(p+q=n-ed+2\)
  2. \(pq=n\)

我们考虑完全平方公式

\((p-q)^2=(p+q)^2-4pq\)

\((p-q)^2=(n-ed+2)^2-4n\)

\(p-q=\sqrt{(n-ed+2)^2-4n}\)

现在我们有两个式:

  1. \(p-q=\sqrt{(n-ed+2)^2-4n}\)
  2. \(p+q=n-ed+2\)

两个加起来除以 \(2\) 就是 \(p\),然后根据第 \(2\) 个式求 \(q\) 即可。

注意会炸 long long, 请使用 long double

\(\mathfrak{Code\,Here}\)

#include<bits\stdc++.h>

int k;
int main()
{
    scanf("%d", &k);
    while(k --)
    {
        long double p, q, g, n, e, d, j;
        
        scanf("%Lf %Lf %Lf", &n, &d, &e);
        
        g = 1.0 * n - e * d + 2;
        j = sqrt(g * g - 4 * n);
        
        p = 1.0 * (g + j) / 2;
        q = 1.0 * g - p;
        
        if(((long long)p) != p || ((long long)q) != q)
        {
            printf("NO\n");
        }
        else 
        {
            printf("%lld %lld\n", (long long)(p < q ? p : q), (long long)(p > q ? p : q));
        }
    }
    return 0;
}


0x03 逻辑表达式

本人蒟蒻,不会做……

0x04 上升点列

题目大意

给你 \(n\) 个二维平面上的点,再给你一些可以自由选择的 \(k\) 个点,让你用这 \(n\)\(k\) 个点组成最长不下降子序列。(这些点必须是连续的,也就是说必须两个相邻的点之间的平面距离)。

数据范围:保证对于所有数据满足:\(1 \leq n \leq 500,0 \leq k \leq 100\)。给定的整点,其横纵坐标 \(1 \leq x_i, y_i \leq {10}^9\)

思路

设状态 \(f_{i,j}\) 为枚举到第 \(i\) 个点,我们还剩余 \(j\) 个添加自由点的机会,此时满足题意的点的最大长度。

易得如下方程。

\[f_{i,j}=\max(f_{k,j+d}+d+1) \]

最终答案为 \(\max(f_{i,j}+j) \ j \in [1,k]\)\(d\) 表示在点 \(x\) 和点 \(y\) 之间,我们需要加多少个自由点才能满足题意。
?
复杂度为 \(O(n^2k)\)

\(\mathfrak{Code\,Here}\)

#include<bits\stdc++.h>

using namespace std;

struct node
{
    int x, y;
    
    bool operator < (const node &w)
    {
        if(x == w.x)
        {
            return y < w.y;
        }
        return x < w.x;
    }
};

int n,k;
int f[510][110];
node a[510];

int muan()
{
    scanf("%d %d",&n,&k);

    for(int i = 1; i <= n; i++)
    {
        scanf("%d %d", &a[i].x, &a[i].y);
    }
    
    sort(a + 1, a + 1 + n);

    for(int i = 1; i <= n; i++)
    {
        f[i][k] = 1;

        for(int j = 0; j <= k; j++)
        {
            for(int t = 1; t < i; t++)
            {
                if(a[t].x > a[i].x || a[t].y > a[i].y)
                {
                    continue;
                }
                
                int d = abs(a[i].x - a[t].x) + abs(a[i].y - a[t].y) - 1;
        
                if(j + d > k)
                {
                    continue;
                }
        
                f[i][j] = max(f[i][j], f[t][j+d]+d+1);
            }
        }
    }
    
    int ans = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = 0; j <= k; j++)
        {
            ans = max(ans, j + f[i][j]);
        }
    }
    
    cout << ans;
    
    return 0;
}
posted on 2023-03-19 11:04  Carey_Chen  阅读(234)  评论(0)    收藏  举报