给定四个整数和。
我们要选择两个整数和(;)。输出最大的。
输出最大的。
输出 | ||||
---|---|---|---|---|
如果要最大,那么要尽可能大、要尽可能小。因此,取最大值,取最小值。所以,我们直接输出即可。
#include <cstdio>
using namespace std;
int main()
{
int a, b, c, d;
scanf("%d%d%d%d", &a, &b, &c, &d);
printf("%d\n", b - c);
return 0;
}
给定一个数,求。
输出。
输出 | |
---|---|
只需找到小数点并将其及后面的数位删去再输出即可。例如:
#include <cstdio>
using namespace std;
int main()
{
char c;
while((c = getchar()) != '\n')
{
if(c == '.') return 0;
putchar(c);
}
return 0;
}
~之间有多少个数是另一个正整数重复两遍得来的?
输出答案。
输出 | |
---|---|
这道题说白了就是要找到最大的,使得重复两遍不超过,并输出。我们可以使用二分法求出最大的。
注意:这里的二分右边界最好设置为,否则一不小心就会溢出!
#include <cstdio>
#include <cmath>
using namespace std;
typedef long long LL;
inline bool check(const LL& x, const LL& n)
{
LL p = 1LL;
while(p <= x) p *= 10LL;
return x * p + x <= n;
}
int main()
{
LL n;
scanf("%lld", &n);
LL l = 0LL, r = sqrt(n);
while(l < r)
{
LL mid = l + r + 1LL >> 1LL;
if(check(mid, n)) l = mid;
else r = mid - 1;
}
printf("%lld\n", l);
return 0;
}
有一个的地板,请你在地板上铺砖。
有两种地砖:和。地砖有个,是的可旋转长方形。地砖有个,是的正方形。问要将这个地板正好铺满,总共有多少种铺法?
输出答案。
输出 | ||||
---|---|---|---|---|
由于数据范围较小,我们可以用暴力搜索解决这道题。注意,这里搜索时为了避免重复计算,我们每次递归只尝试一个位置,这样还能有效加速。具体请看代码。
#include <cstdio>
#define maxn 20
using namespace std;
bool mat[maxn][maxn];
int h, w, a, b, ans;
inline bool valid(int x, int y)
{
return !mat[x][y] && x >= 0 && x < h && y >= 0 && y < w;
}
void dfs(int i, int j, int usedA, int usedB)
{
if((usedA << 1) + usedB == h * w)
{
ans ++;
return;
}
if(i == h) return;
int ni, nj;
if(j == w - 1) ni = i + 1, nj = 0;
else ni = i, nj = j + 1;
if(mat[i][j])
{
dfs(ni, nj, usedA, usedB);
return;
}
mat[i][j] = true;
// Rectangle (A)
if(usedA < a)
{
if(valid(i, j + 1))
{
mat[i][j + 1] = true;
dfs(ni, nj, usedA + 1, usedB);
mat[i][j + 1] = false;
}
if(valid(i + 1, j))
{
mat[i + 1][j] = true;
dfs(ni, nj, usedA + 1, usedB);
mat[i + 1][j] = false;
}
}
// Square (B)
if(usedB < b) dfs(ni, nj, usedA, usedB + 1);
mat[i][j] = false;
}
int main()
{
scanf("%d%d%d%d", &h, &w, &a, &b);
dfs(0, 0, 0, 0);
printf("%d\n", ans);
return 0;
}
给定三个整数序列、和。
我们如下定义个函数:
对于每个,求。
输出行。第行应该包含。
3
-10 2
10 1
10 3
5
-15 -10 -5 0 5
0
0
5
10
10
在这里,,则有:
(参考AtCoder官方题解)
很容易想到,我们可以直接照做,即分别计算每个。但是,这样做的时间复杂度是,所以肯定会TLE
。
我们考虑它们的复合函数在图上怎么表示。
所以,我们可以得到下图:
或者说,存在三个数使得。
关于的具体计算请看代码。
注意:这里的代码中的(INF
)一定不能直接设为long long
的最大值,否则会溢出!
#include <cstdio>
#include <algorithm>
#include <climits>
using namespace std;
typedef long long LL;
const LL INF = LLONG_MAX >> 1LL;
int main()
{
LL l = -INF, r = INF, add = 0LL;
int n, q;
scanf("%d", &n);
while(n--)
{
LL a, t;
scanf("%lld%lld", &a, &t);
if(t == 1) l += a, r += a, add += a;
else if(t == 2) l = max(l, a), r = max(r, a);
else l = min(l, a), r = min(r, a);
}
scanf("%d", &q);
while(q--)
{
LL x;
scanf("%lld", &x);
printf("%lld\n", clamp(x + add, l, r));
}
return 0;
}