Codeforces Round #680 (Div. 2 A~D)

A. Array Rearrangment(贪心)

思路

  1. 枚举 a 串中的每个数 u,之后在 b 串中找到一个尽量大的数字 v,且(u+v <=x), 如果在枚举某个 u 的时候无法找到与匹配的 v,就输出 no

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <string>
#include <map>
#include <bitset>
#include <vector>
void fre() { system("clear"), freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
void Fre() { system("clear"), freopen("A.txt", "r", stdin);}
void Run(int x = 0) {     
#ifdef ACM  //宏定义免注释 freopen
    if(! x) fre(); else Fre();
#endif
}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define db double
#define ll long long
#define ull unsigned long long
#define Pir pair<ll, ll>
#define m_p make_pair
#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)
#define memset(a, b, c) memset(a, (int)b, c);
#define size() size() * 1LL
#define sc scanf
#define pr printf
#define sd(a) scanf("%lld", &a)
#define ss(a) scanf("%s", a)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define esp 1e-7
#define mod (ll)(1e9 + 7)
using namespace std;
/*=========================ACMer===========================*/
const ll mxn = 2e3 + 10;
ll ar[mxn], br[mxn];

int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        ll n, x;
        sc("%lld %lld", &n, &x);
        for_(i, 1, n)
        {
            sd(ar[i]);
        }
        for_(i, 1, n)
        {
            sd(br[i]);
        }

        sort(ar + 1, ar + 1 + n);
        sort(br + 1, br + 1 + n, greater<ll>());
        ll mk = 1;
        for_(i, 1, n)
        {
            ll flag = 0;
            ll cha = x - ar[i];
            for_(j, 1, n)
            {
                if(br[i] == -1 || br[i] > cha) continue; 

                br[i] = -1;
                flag = 1;
                break;
            }

            if(! flag)
            {
                mk = 0;
                break;
            }
        }
        if(mk)
            pr("Yes\n");
        else
            pr("No\n");

    }



    return 0;
}


B. Elimination(贪心)

思路

  1. 在第一场比赛中可能产生前 100 名的最低分是 a+b,
  2. 在第二场比赛中可能产生前 100 名的最低分是 c+d,
  3. 所有答案是 max (a+b, c+d).

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <string>
#include <map>
#include <bitset>
#include <vector>
void fre() { system("clear"), freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
void Fre() { system("clear"), freopen("A.txt", "r", stdin);}
void Run(int x = 0) {     
#ifdef ACM  //宏定义免注释 freopen
    if(! x) fre(); else Fre();
#endif
}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define db double
#define ll long long
#define ull unsigned long long
#define Pir pair<ll, ll>
#define m_p make_pair
#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)
#define memset(a, b, c) memset(a, (int)b, c);
#define size() size() * 1LL
#define sc scanf
#define pr printf
#define sd(a) scanf("%lld", &a)
#define ss(a) scanf("%s", a)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define esp 1e-7
#define mod (ll)(1e9 + 7)
using namespace std;
/*=========================ACMer===========================*/
const ll mxn = 2e3 + 10;
ll ar[mxn], br[mxn];

int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        ll a, b, c, d;
        sc("%lld %lld %lld %lld", &a, &b, &c, &d);
        pr("%lld\n", max(a + b, c + d));
    }

    return 0;
}

C. Division(贪心、分解质因数)

思路

  1. x 能整除 p,说明 x 是 p 的因子,
  2. q 不能整除 x,说明 q 不是 x 的因子,
  3. x 的最大取值是 p,要想获得 x 尽量大,就要从 p 中减少尽可能少的质因子,从而形成 x,
  4. 我们对 q 进行质因子分解(唯一分解定理) q = a 1 b 1 ∗ a 2 b 2 ∗ . . . ∗ a i b i q=a_1^{b1}*a_2^{b2}*...*a_i^{bi} q=a1b1a2b2...aibi(ai 为素数),我只需要改变某一个质因子 a x a_x ax 在 p 中出现的次数小于 q 中出现的次数, 那么改变之后形成的 p ′ p' p 就不能被 q 整除了,这个时候 p ′ p' p 就是一个可能的答案,但不是最有的答案,
  5. 我枚举 q 中的所有质因子 a i ai ai, 对所有得出的 p ′ p' p 维护一个最优值就是答案了,

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <string>
#include <map>
#include <bitset>
#include <vector>
void fre() { system("clear"), freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
void Fre() { system("clear"), freopen("A.txt", "r", stdin);}
void Run(int x = 0) {     
#ifdef ACM  //宏定义免注释 freopen
    if(! x) fre(); else Fre();
#endif
}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define db double
#define ll long long
#define ull unsigned long long
#define Pir pair<ll, ll>
#define m_p make_pair
#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)
#define memset(a, b, c) memset(a, (int)b, c);
#define size() size() * 1LL
#define sc scanf
#define pr printf
#define sd(a) scanf("%lld", &a)
#define ss(a) scanf("%s", a)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define esp 1e-7
#define mod (ll)(1e9 + 7)
using namespace std;
/*=========================ACMer===========================*/
const ll mxn = 2e3 + 10;
ll ar[mxn], br[mxn];
vector<Pir> fac;
void get_fac(ll n)
{
    fac.clear();
    for (ll i = 2; i * i <= n; i ++)
    {
        if(n % i == 0)
        {
            ll num = 0;
            while(n % i == 0) n /= i, num ++;
            fac.pb(m_p(i, num));
        }
    }
    if(n != 1) fac.pb(m_p(n, 1));
}

ll q_pow(ll a, ll b)
{
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a;
        a = a * a;
        b >>= 1;
    }
    return res;
}

int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        ll p, q;
        sc("%lld %lld", &p, &q);
        if(p % q)
        {
            pr("%lld\n", p);
            continue;
        }

        ll ans = 0;
        get_fac(q);
        for (auto x : fac)
        {
            ll t = p;
            ll num = 0;
            while(t % x.fi == 0) t /= x.fi, num ++;
            ans = max(ans, t * q_pow(x.fi, max(min(num, x.se - 1), 0LL)));
        }
        pr("%lld\n", ans);
    }

    return 0;
}

D. Divide and Sum

题意

  1. 给我 2n 个数存放在 ar 数组中,我们任选 n 个数形成一个 p 数组,剩下的 n 个元素形成 q 数组,
  2. 对 p 数组进行从小到大排序,
  3. 对 q 数组进行从大到小排序,
  4. p、q 中对应位置的元素为 { x i , y i x_i, y_i xi,yi},
  5. 定义 ∑ i = 1 i < = n f ( p , q ) = ∣ x i − y i ∣ \sum _{i=1}^{i<=n}f(p,q)=|x_i-y_i| i=1i<=nf(p,q)=xiyi,
  6. 因为 p 有 C 2 n n 中 选 择 方 案 , C_{2n}^{n} 中选择方案, C2nn现在让我们求 ∑ f ( p , q ) \sum f(p,q) f(p,q)

思路

  1. 一位一位的考虑每个数对答案的贡献,
  2. 说结论,
  3. 当 i>n 的时候,ar [i] 总是在 f ( p , q ) = ∣ x i − y i ∣ f(p,q)=|x_i-y_i| f(p,q)=xiyi 中总是作为被减数,
  4. 当 i<=n 的时候,ar [i] 总是在 f ( p , q ) = ∣ x i − y i ∣ f(p,q)=|x_i-y_i| f(p,q)=xiyi 中总是作为减数,
  5. 所以最终答案就是: C 2 n n ∗ ( ∑ i = n + 1 i < = 2 ∗ n − ∑ i = 1 i < = n ) C_{2n}^{n}*(\sum_{i=n+1}^{i<=2*n}-\sum_{i=1}^{i<=n}) C2nn(i=n+1i<=2ni=1i<=n)
  6. 给出一个理解,
  7. 因为的打当 i<=n 的时候,ar [i] 我们无论把它选择 p 还是 q 中,假设它被选进了 p 数组中,那么在对应位置上的 q 数组的那个元素的值一定 >=ar [i];
  8. ar [i] 被选入 q 数组也同理,
  9. 具体证明看大佬博客,

大佬博客传送🚪

代码

#include <iostream>
#include <stdio.h>
#include <string.h>
#include <math.h>
#include <algorithm>
#include <string>
#include <string>
#include <map>
#include <bitset>
#include <vector>
void fre() { system("clear"), freopen("A.txt", "r", stdin); freopen("Ans.txt","w",stdout); }
void Fre() { system("clear"), freopen("A.txt", "r", stdin);}
void Run(int x = 0) {     
#ifdef ACM  //宏定义免注释 freopen
    if(! x) fre(); else Fre();
#endif
}
#define ios ios::sync_with_stdio(false)
#define Pi acos(-1)
#define pb push_back
#define fi first
#define se second
#define db double
#define ll long long
#define ull unsigned long long
#define Pir pair<ll, ll>
#define m_p make_pair
#define for_(i, s, e) for(ll i = (ll)(s); i <= (ll)(e); i ++)
#define rep_(i, e, s) for(ll i = (ll)(e); i >= (ll)(s); i --)
#define memset(a, b, c) memset(a, (int)b, c);
#define size() size() * 1LL
#define sc scanf
#define pr printf
#define sd(a) scanf("%lld", &a)
#define ss(a) scanf("%s", a)
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define esp 1e-7
#define mod (ll)(998244353)
using namespace std;
/*=========================ACMer===========================*/
const ll mxn = 1e6;
ll p[mxn], ar[mxn];

void pre_do(ll n)
{
    p[0] = 1;
    for_(i, 1, n) p[i] = p[i - 1] * i % mod;
}
ll q_pow(ll a, ll b)
{
    ll res = 1;
    while(b)
    {
        if(b & 1) res = res * a % mod;
        a = a * a % mod;
        b >>= 1;
    }
    return res;
}

ll inv(ll n)
{
    return q_pow(n, mod - 2);
}

ll C(ll m, ll n)        //从 m 中选择 n 个物品的方案数
{
    return p[m] * inv(p[n]) % mod * inv(p[m - n]) % mod;
}


int main()
{
    Run();
    ll n; sd(n);
    pre_do(2 * n);
    for_(i, 1, 2 * n)
    {
        sd(ar[i]);
    }
    sort(ar + 1, ar + 1 + 2 * n);
    ll ans = 0;
    for_(i, 1, 2 * n)
    {
        if(i <= n)
        {
            ans = (ans - ar[i] + mod) % mod;
        }
        else
        {
            ans = (ans + ar[i]) % mod;
        }
    }

    pr("%lld\n", ans * C(2 * n, n) % mod);

    return 0;
}


  • 2
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值