警告:抄代码者 \(\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\)。
现在我们有两个式:
- \(p+q=n-ed+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}\)
现在我们有两个式:
- \(p-q=\sqrt{(n-ed+2)^2-4n}\)
- \(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\) 个添加自由点的机会,此时满足题意的点的最大长度。
易得如下方程。
最终答案为 \(\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;
}
浙公网安备 33010602011771号