codeforces 118 div2(a,b,c)
好像很久没有写整场比赛的题解了哈…补一场
(1900分的d谁会啊…)
这个
a
,
b
a,b
a,b挺有意思的,
c
c
c就是一个裸的二分
比赛题目链接
A
题目大意
给定两个数的描述,请你比较两个数的大小关系,每个数的描述为,一个数 x x x,一个数 y y y, y y y表示 x x x的后面有 y y y个 0 0 0
思路
考察细心和把很大的数(没法存储的)化简小的方法。
先分别读取
x
1
,
y
1
,
x
2
,
y
2
x1,y1,x2,y2
x1,y1,x2,y2
首先我们容易发现,可以让两个数后面的
0
0
0先相互消除一下,也就是
y
1
,
y
2
y1,y2
y1,y2分别减去
m
i
n
(
y
1
,
y
2
)
min(y1,y2)
min(y1,y2),这样其中一个会变成
0
0
0。
现在另外一个
y
y
y可能还是很大,已知
x
x
x最大为
1
e
6
1e6
1e6,所以当另一个
y
>
=
7
y>=7
y>=7的时候,就出答案了
如果没有
y
>
=
7
y>=7
y>=7,就循环乘
10
10
10,最后判断谁大就行了
ACcode
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve()
{
ll x1, y1, x2, y2;
cin >> x1 >> y1 >> x2 >> y2;
ll p = min(y1, y2);
y1 -= p;
y2 -= p;
if (y1 >= 7) {
cout << '>' << '\n';
return;
}
else if (y2 >= 7) {
cout << '<' << '\n';
return;
}
while (y1--)x1 *= 10;
while (y2--)x2 *= 10;
if (x1 == x2)cout << '=' << '\n';
else if (x1 > x2)cout << '>' << '\n';
else if (x1 < x2)cout << '<' << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
B
题目大意
给定含有 n n n个不同的正整数的数组 a a a, n n n为偶数,请找到并输出 n / 2 n/2 n/2对 x , y x,y x,y,且 x , y x,y x,y存在于数组内, x ! = y x!=y x!=y, x x x% y y y不在数组内,若有多组答案,随便输出一组即可
思路
已知 a a a% y y y < y <y <y,而且题目中说可以同一个数可以多次利用,所以任何数对最小值取余结果都不存在,累计输出就完了
ACcode
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
void solve() {
int n;cin >> n;
vector<int>a(n + 3);
for (int i = 1;i <= n;i++)cin >> a[i];
sort(a.begin() + 1, a.begin() + 1 + n);
int ans = 0;
for (int i = n;i >= 1;i--) {
cout << a[i] << ' ' << a[1] << '\n';
ans++;
if (ans == n / 2)return;
}
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
C
题目大意
给定 n n n次攻击和阈值 k k k,第 i i i次攻击在第 a [ i ] a[i] a[i]时刻开始,每次攻击可持续 x x x秒,且每次攻击可刷新 x x x,问最小的 x x x
思路
裸的二分
c
h
e
c
k
check
check的写法见
c
o
d
e
code
code
ACcode
#include<bits/stdc++.h>
using namespace std;
using ll = long long;
const int M = 110;
ll a[M];
ll n, b;
ll j, k, mid;
bool check(ll x) {//二分找单次攻击持续时间
ll ans = 0;
for (int i = 1;i < n;i++) {
if (a[i] + x <= a[i + 1])ans += x;
else ans += (a[i + 1] - a[i]);
}
ans += x;
return ans >= b;
}
void solve()
{
cin >> n >> b;//攻击次数,目标伤害量(持续伤害的时间
for (int i = 1;i <= n;i++)cin >> a[i];
j = 0;k = b;
while (j < k) {
mid = j + k >> 1;
if (check(mid))k = mid;
else j = mid + 1;
}
cout << k << '\n';
}
int main()
{
ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
int t;cin >> t;
while (t--) {
solve();
}
return 0;
}
本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。 如若内容造成侵权/违法违规/事实不符,请联系我的编程经验分享网邮箱:veading@qq.com进行投诉反馈,一经查实,立即删除!