Educational Codeforces Round 118 div.2 ABC

A.Long Comparison

题目大意:给定两个数字 x 1 , x 2 x_1, x_2 x1,x2,以及参数 p 1 , p 2 p_1,p_2 p1,p2,表示在 x 1 , x 2 x_1,x_2 x1,x2后面加上 p 1 , p 2 p1_,p_2 p1,p2 0 0 0。然后比较 a a a b b b的大小.

思路分析:首先统一数位,将两个数字化为相同位数的数字,然后根据后缀( 1 0 ( p 2 − p 1 ) 10^{(p_2 - p_1)} 10(p2p1))分类讨论即可。

#include 
#define int long long
using namespace std;


int get(int num, int cnt = 0){
    while(num) cnt += 1, num /= 10;
    return cnt;
}

inline void solve(){
    int x1, p1; cin >> x1 >> p1;
    int x2, p2; cin >> x2 >> p2;
    int xp1 = get(x1), xp2 = get(x2);
    if(xp1 > xp2) while(xp1 - xp2) xp1--, x2 *= 10, p2--;
    if(xp2 > xp1) while(xp2 - xp1) xp2--, x1 *= 10, p1--;
    int det = p2 - p1;
    if(x1 > x2) puts((det <= 0 ? ">" : "<"));
    else if(x1 < x2) puts((det >= 0 ? "<" : ">"));
    else if(x1 == x2){
        if(det == 0) puts("=");
        else if(det < 0) puts(">");
        else puts("<");
    }
}

signed main(){
    int t = 0; cin >> t;
    while(t--) solve();

    return 0;
}

B.Absent Remainder

题目大意:给定序列 { a 1 , a 2 , … , a n } \{a_1, a_2, \dots, a_n\} {a1,a2,,an},序列内元素各不相同。要求构造 ⌊ n 2 ⌋ \lfloor \frac{n}{2} \rfloor 2n ( x , y ) (x, y) (x,y),满足 x ≠ y   ∩   x m o d    y ∉ { a i } x \neq y\ \cap\ x \mod y \notin \{a_i\} x=y  xmody/{ai}

找到序列的最小值作为 y y y,然后找 ⌊ n 2 ⌋ \lfloor \frac{n}{2} \rfloor 2n对元素作为 x x x即可。容易知道 a i m o d    a m i n n < a m i n n a_i \mod a_{minn} < a_{minn} aimodaminn<aminn,即该元素小于序列最小值,不在序列中出现。

#include 
#define int long long
using namespace std;

const int N = 2e5 + 10;
int a[N];

inline void solve(){
    int n = 0; cin >> n;
    for(int i = 1; i <= n; i++) cin >> a[i];
    sort(a + 1, a + 1 + n);
    for(int i = 1; i <= n / 2; i++) cout << a[1 + i] << ' ' << a[1] << endl;
}

signed main(){
    int t = 0; cin >> t;
    while(t--) solve();
    return 0;
}

C.Poisoned Dagger

题目大意:Monocarp正在玩另一个电脑游戏。在这个游戏中,他的角色必须要杀死一条龙。与龙的战斗持续了100500秒,在此期间,Monocarp用一把有毒的匕首攻击龙。第i次攻击是在战斗开始后的第i秒开始进行。匕首本身不造成伤害,但它对龙施加了一个毒药效果,在接下来的k秒内(从龙被匕首刺中的那一秒开始)每次造成1次伤害。然而,如果龙已经被毒死,那么匕首就会更新毒药效果(即取消当前的毒药效果并应用一个新的效果)。

例如,假设k=4,并且Monocarp在2、4和10秒内刺中了龙。然后,在第2秒开始时应用毒药效果,在第2秒和第3秒造成1次伤害;然后,在第4秒开始时,重新应用毒药效果,因此在第4、5、6和7秒正好造成1次伤害;然后,在第10秒,再次应用毒药效果,在第10、11、12和13秒造成1次伤害。总的来说,龙受到了10次伤害。

莫诺卡普知道龙有h个命中率,如果他在战斗中对龙造成至少h个伤害–他就杀了龙。Monocarp还没有决定他在战斗中使用的毒药的强度,所以他想找到k(毒药效果持续的秒数)的最小可能值,足以对龙造成至少h的伤害。

思路分析:直接二分答案。对于每个 m i d mid mid直接 O ( n ) O(n) O(n)暴力模拟累加判断即可。

#include 
#define int long long
using namespace std;

const int N = 200;
int a[N], n, h;

inline int calc(int val, int ans = h){
    ans -= val;
    for(int i = 1; i <= n; i++) ans -= min(val, a[i] - a[i - 1]);
    return ans;
}

inline void solve(){
    cin >> n >> h;
    for(int i = 1; i <= n; i++) cin >> a[i]; a[0] = a[1];
    int l = 1, r = h;
    while(l <= r){
        int mid = l + r >> 1;
        if(calc(mid) <= 0) r = mid - 1;
        else l = mid + 1;
    }
    cout << l << endl;
}

signed main(){
    int t = 0; cin >> t;
    while(t--) solve();
    return 0;
}

你可能感兴趣的:(codeforces,比赛题解,acm竞赛,算法,组合数学)