2022牛客寒假算法基础集训营1 (E、J、L)

三题蒟蒻Orz

有空补题


目录

E 炸鸡块君的高中回忆

J 小朋友做游戏

L 牛牛学走路


E 炸鸡块君的高中回忆

炸鸡块君在高中时,学校规定进出校门必须要刷校园卡,否则禁止进入。

某一天,炸鸡块君和同学们一共nnn个人去学校附近玩耍,但回学校时他们发现只有mmm个人带了校园卡,于是他们想到了这样一个策略:先让mmm个人带校园卡进入学校,再派一个人带着所有mmm张校园卡出来,重复上述过程,直到所有人进入学校。

假设从外面进入学校和从校内出来到校外都需要花费一个单位的时间,求所有人都进入学校最少需要花费几个单位的时间。

输入描述:

输入第一行是一个整数T(1≤T≤10^5),表示测试组数。

每组测试包括两个整数n,m(1≤m≤n≤10^9),含义如题目所示。

输出描述:

输出一个整数,表示所有人进入学校需要花费最少几个单位时间。特别的,若无法让所有人进入学校,输出−1。

示例1

输入

3
6 3
10 10
10 1

输出

5
1
-1

除去特殊情况, 均有几次来回 和最后一趟单向

 

所以来回次数a 取(n-2)/(m-1)

结果为 2a+1

#include<iostream>
using namespace std;

int main()
{
    int t;
    cin >> t;
    
    long long n,m;
    while(t --)
    {
        scanf("%lld%lld",&n, &m);
        if(n == m) puts("1");
        else if(m == 1) puts("-1");
        else {
            long long res = (n-2)/(m-1);
            res = res * 2 + 1;
            printf("%lld\n",res);
        }
    }
    return 0;
}

J 小朋友做游戏

示例1

输入

3
3 6 7
1 3 4
5 4 3 4 3 5
4 6 7
1 3 4 1
5 4 3 4 3 5
7 7 7
1 2 3 4 5 6 7
9 8 7 6 5 4 3

输出

-1
23
46

#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;

const int N = 10010;
int a[N],b[N],sa[N];

int main()
{
    int t;
    cin >> t;
    
    int A,B,n;
    while(t--)
    {
        vector<int> v;
        scanf("%d%d%d",&A,&B,&n);
        for(int i = 1; i <= A; i ++) scanf("%d",&a[i]);
        for(int i = 1; i <= B; i ++) scanf("%d",&b[i]);
        if(2*A < n) {
            puts("-1");
        }else{
            sort(a+1, a+A+1, greater<int>());
            sort(b+1, b+B+1, greater<int>());
            sa[1]=a[1];
            for(int i = 2; i <= A; i ++) sa[i] = a[i]+sa[i-1];//求a的前缀和
            
            int cnta = (n+1)/2;
            long long res = sa[cnta];
            for(int i = cnta+1, cnt=0; cnt <= n-cnta && i <= A; i++) {
                v.push_back(a[i]);
                cnt++;
            }
            for(int i = 1; i <= B; i++) {
                v.push_back(b[i]);
            }
            sort(v.begin(), v.end(), greater<int>());
            for(int i = 0; i < n-cnta; i ++) res += v[i];
            printf("%d\n", res);
        }
    }
    return 0;
}

L 牛牛学走路

输入

3
4
LLLR
4
ULLD
5
LUDDL

输出

3.000000000000
2.236067977500
2.236067977500

 签到题,直接暴力

#include<iostream>
#include<cmath>
#include<algorithm>
using namespace std;

int main()
{
    int t, x;
    cin >> t;
    
    string s;
    while(t --)
    {
        cin >> x >> s;
        float x = 0, y = 0;
        float res = 0;
        for(int i = 0; i < s.length(); i ++)
        {
            if(s[i]=='U') y++;
            else if(s[i]=='D') y--;
            else if(s[i]=='R') x++;
            else x--;
            
            float t = x*x+y*y;
            res = res>t ? res :t;
        }
        printf("%.6f\n",sqrt(res));
    }
    return 0;
}

posted @ 2022-03-15 08:51  泥烟  阅读(55)  评论(0编辑  收藏  举报