2020牛客寒假算法基础集训营5

A.
题意:两个字符串 可以将其中一个字符串做以下操作 使两个字符串相等最小操作步数
任意一个字母替换为另一个
把最后一个字母删除
在尾部添加一个字母

思路:贪心就好 多余的直接删掉 不相同的再更改即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL ;
typedef pair<int,int> pii;

#define fi first
#define se second

const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1);

const int N = 2e5+5;
const int M = 2005;
const LL mod = 998244353;

int v1[205],v2[205];

int main()
{
    int n,m;

    cin >> n >> m;

    string s,t;

    cin >> s >> t;

    int res = 0;

    res += abs(n-m);

    for(int i = 0; i < min(n,m);i ++)
    {
        if(s[i] != t[i])
            res++;
    }

    cout << res  << '\n';

    return 0;
}


B.
待补

D.
题意:在x轴上的两个点 a,b 其中a有两种移动方式 1单位距离/单位时间的速度移动任意时间 和 花费1单位时间进行闪现到 当前坐标的立方根处
思路:贪心 每次选择最优的方法就是最优的答案

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL ;
typedef pair<int,int> pii;

#define fi first
#define se second

const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1);

const int N = 2e5+5;
const int M = 2005;
const LL mod = 998244353;

char s[15];
char t[15];

int main()
{
    int T;

    ios::sync_with_stdio(false);

    cin >> T ;

    while(T --)
    {
        double a,b;

        cin >> a >> b;

        double res = 0;

        while(1)
        {
            double next = cbrt(a);///闪现的位置 cbrt为立方根函数

            if(fabs(b-next) < fabs(b-a)-1) ///闪现的之后离b的距离和正常走离b的距离比较 闪现更接近b则使用闪现
                res += 1.0,a = next;
            else
                {res += fabs(b-a);break;}///否则就正常走
        }

        printf("%.8f\n",res);
    }

    return 0;
}


E.
题意:
初始一共有n张卡牌
先手第一步最少要拿1张牌,最多要拿n−1张牌。
接下来每一步,双方最少要拿1张牌,最多拿等同于上一步对方拿的牌数的牌。
拿走最后一张牌的人将取得游戏的胜利。

思路:博弈 找规律 只要是2的幂次 就是Alice 否则是Bob 如果是2的幂次先手直接拿等同于其二进制最低位的数量的张数是必赢的

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL ;
typedef pair<int,int> pii;

#define fi first
#define se second

const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1);

const int N = 2e5+5;
const int M = 2005;
const LL mod = 998244353;

int main()
{
    LL n;

    LL temp = 1;

    cin >> n;

    for(int i = 1;i <= 60;i ++)
    {
        if(temp == n)
        {
            cout << "Alice" << '\n';
            return 0;
        }

        temp = temp * 2;
    }

    cout << "Bob" << '\n';

    return 0;
}


H.https://ac.nowcoder.com/acm/contest/3006/H

思路:可以发现这个哈希函数是转26进制的 那么我们先把字符串转换成26进制的整数 后+mod转回26进制即可

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL ;
typedef pair<int,int> pii;

#define fi first
#define se second

const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1);

const int N = 2e5+5;
const int M = 2005;
const LL mod = 998244353;

char s[15];
char t[15];

int main()
{
    int mod ;

    while(~scanf("%s%d",s,&mod))
    {
        LL res = 0;

        for(int i = 0;i < 6;i ++)
            res = res*26 + s[i]-'a';

        res += mod;

        for(int i = 5;i >= 0;i --)
        {
            s[i] = res % 26 + 'a';
            res /= 26;
        }

        if(res)
            cout << "-1" << '\n';
        else
            cout << s << '\n';
    }

    return 0;
}


I.
题意:签到 判断是不是前三 并列也可以 或者 过题人数是否超过80%

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL ;
typedef pair<int,int> pii;

#define fi first
#define se second

const int INF = 0x3f3f3f3f;
const double eps = 1e-7;
const double pi=acos(-1);

const int N = 2e5+5;
const int M = 2005;
const LL mod = 998244353;

int a[15];

int main()
{
    int n,m;

    cin >> n >> m;

    for(int i = 1;i <= n ;i ++)
    {
        cin >> a[i];
    }

    int t = a[9];

    int cnt = 0;

    for(int i = 1;i <= n;i ++)
    {
        if(a[i] > t)
            cnt++;
    }

    if(cnt <=2 || t >= m*0.8)
        cout << "Yes" << '\n';
    else
        cout << "No" << '\n';


    return 0;
}


J.
题意:圆内正n边形两个端点之间的最小距离
思路:
在这里插入图片描述
公式一套就好 注意逆时针走更好还是顺时针

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
#include <algorithm>
#include <set>
#include <map>
#include <vector>
#include <stack>
#include <queue>

using namespace std;
typedef long long LL ;
typedef pair<int,int> pii;

#define fi first
#define se second

const int INF = 0x3f3f3f3f;
const double eps = 1e-6;
const double pi = acos(-1);

const int N = 1e5+5;
const int M = 2005;
const int mod = 1e9+7;

int main()
{
    double n,r;

    double i,j;

    cin >> n >> r >> i >> j;

    if(i > j)
       swap(i,j);
    
    double k = min(j-i,n-j+i);///有个细节 n-(j-i) = n-j+i
        
    double res = 2*r*sin(pi/n)*k;

    printf("%.8f\n",res);

    return 0;
}


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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值