Educational Codeforces Round 99 (Rated for Div. 2)(A~D)

A. Strange Functions

题意

  1. 给我们一个长度 100 位的数字串 n,如 12345000
  2. 定义一个函数:f (x) 作用是把 x 颠倒,并且把前导 0 去掉,
  3. 那 f (f (x)) 的作用就是把 x 后面的 0 全部去掉,
  4. 给我们一个 n 让我们求 1~n 之间 y= x/f (f (x)) 产生的不同 y 值?

思路

  1. 很简单的规律:答案就是 n 的位数,

代码

#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===========================*/




int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        string s;
        cin >> s;
        cout << (s.size()) << endl;
    }

    return 0;
}


B. Jumps

题意

  1. 刚开始的时候,一个人在 ox 轴的原点 0 位置,想要到 x 位置,
  2. 对于第 i 次操作,假设当前这个人的位置在 y,
    1. 第一种操作可以让这个人的向前走 i 步,即 y += i;
    2. 第二种操作可以让这个人向后走 1 步,即 y -= 1;
  3. 问到 x 最少需要走多少步?

思路

  1. 这一题有点难叙述,大致的思路就是,当人的位置 y 小于 x 的时候,一直向前走(假设这个是第 i 步),那么令 y+= i, 如果此时 y 仍然小于 x 继续令 y+=(i+1)…,
  2. 一直加 i 直到,y >= x 的时候,这个时候计算出差值:cha = y - x,如果差值 > i+1 的话就继续进行第一种操作,(需要特判 cha = 1 的时候也需要进行第一种操作,因为差 1 的时候,我们需要把 i0 的时候的哪一步从第一种操作变成第二种操作,但是 i==0 是不存的)
  3. 到 y >= x && cha <= i + 1 的时候我们需要 cha 给去除掉,这个时候我们只需要让 i=cha-1 的时候的哪一步从 y+= i 变成 y -= 1 操作就行了.

代码

#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===========================*/




int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        ll n; sd(n);
        ll sum = 0;
        ll ans;
        for (ll i = 1; ; i ++)
        {
            sum += i;
            if(sum < n) continue;
            if(sum >= n)
            {
                ll cha = sum - n;
                if(cha == 1) continue;
                if(cha <= i + 1)
                {
                    ans = i;
                    break;
                }
            }
        }
        pr("%lld\n", ans);
    }

    return 0;
}

C. Ping-pong

题意

  1. 两个人玩乒乓球,第一个人 Alice 有 x 个拍子,第二个人 Bob 有 y 个,
  2. 每一次接发球消耗一个拍子,没有拍子就无法接发球(那么就会造成别人的发的求,自己无法接,使自己直接输一局),
  3. 第一个人先发球,第二个人可以选择接或者不接,
  4. 哪个人赢了,那么下一轮这个人还要发球(消耗这个人的一个拍子),
  5. 重点来了:Both Alice and Bob play optimally and want to, firstly, maximize their number of wins and, secondly, minimize the number of wins of their opponent. 这个两个人都会先考虑在自己赢最多局的情况下,才会考虑让对手尽可能的多输。

思路

  1. 这题分类讨论一下,就好做多了,
  2. 首相 x == y, 的时候,如果 Bob 想自己赢得尽可能的多的情况下,那么最好就是 Alice 的前 x-1 个次发球不接,当 Alice 最后一次发球的时候,Bob 再接,那么 Alice 赢 x-1 场, Bob 赢 y 场;
  3. 当 x < y 的时候,也是 Alice 的前 x-1 个球不接,Alice 第 x 次发球的时候接球,那么 Alice 赢 x-1 场, Bob 赢 y 场;
  4. 当 x > y 的时候的 Alice 先发球,我们考虑,Bob 接不接?Bob 当然不会接,因为 Bob 接的话,反而赢得次数会变少(参考题意中的 5),所以这种情况也是 Alice 的前 x-1 个球不接,Alice 第 x 次发球的时候接球,那么 Alice 赢 x-1 场, Bob 赢 y 场
  5. 综上答案就是:x-1, y

代码

#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===========================*/
 
 
 
 
int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        ll x, y;
        sc("%lld %lld", &x, &y);
        printf("%lld %lld\n", x - 1, y);
    }
 
    return 0;
}



D. Sequence and Swaps

题意

  1. 给定一个长度 为 n 的序列 a [],和一个有初始值的 x, 在这里插入图片描述

思路

  1. 这一题应该就是一个明显考察贪心思维的题,其实看懂了非常简单,
  2. 我们考虑如果序列原来就是有序的,那就不用排序了,
  3. 如果不是有序的那我们就应该从左往右找到序列中第一个比 x 的值大的那个数(设其下标为 j)令 x 与 a [x] 的值进行交换 (考虑为什么从左往右找第一个比 x 值大的那个数? 这个是因为:如果我们确定这个序列是不是有序的,如果我不与 a [j] 这个元素进行交换,那么后面 x 必定需要 j 下标之后的某个比 x 大元素(设其下标为 k)进行交换,当 swap (x, a [k]) 之后, 那么 a [k] 的值必然小于 a [j] 的值,使序列变的更加无序)
  4. 之后检查序列是不是有序循环执行步骤 3,否则结束,输出统计的交换次数!!!

代码

#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 = 1005;
ll ar[mxn];
bool check(ll l, ll r)
{
    for_(i, l + 1, r)
    {
        if(ar[i] < ar[i - 1]) 
            return 0;
    }
    return 1;
}

int main()
{
    Run();
    ll T; sd(T);
    while(T --)
    {
        ll n, x;
        sc("%lld %lld", &n, &x);
        for_(i, 1, n) sd(ar[i]);
        ar[n + 1] = INF;
        ll id = 1, ans = 0; 

        while(id != n + 1)
        {
            if(check(id, n)) break;
            while(ar[id] <= x) id ++;
            swap(ar[id], x);
            ans ++;
        }

        if(check(1, n))
            pr("%lld\n", max(ans, 0LL));
        else
            pr("-1\n");
    }


    return 0;
}


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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值