2020 11 22 ICPC长清大学城联赛

A. A+B Problem

A+B Problem

题意:

给你a,b,n,问你从2到9进制中能不能找到一个进制k,使a+b== (c)k。
如果有多个,就输出最小的 ,如果没有就输出-1

思路

模拟。枚举2 到9 进制,判断n是否可以是这个进制的数,如果可以就把n转化成10 进制数判断是否与a + b相等。
我是把a+b转换了,与c比较

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;
ll ar[1005];
ll br[1005];

ll q_pow(ll a, ll b)//这个是快速幂,用来将进制数转换成十进制数
{
    
    
    ll ans = 1;
    while(b > 0)
    {
    
    
        if(b & 1)
        {
    
    
            ans = ans * a ;
        }
        a = a * a;
        b>>=1;
    }
    return ans;
}
int main()
{
    
    
    stack<int>tr;
    ll n, a, b, k, c;
    cin>>a>>b>>c;
    int huai = 0;//统计用的,满八个就输出-1;
    k = a + b;
    ll o = k;//把k的值给o,因为后面k的值在进制转换的时候会变
        for(int j = 2; j < 10; j++)
        {
    
    
            while(k)//用栈把k转换成i进制
            {
    
    
                tr.push(k % j);
                k = k / j;
            }
            int m = tr.size();
            ll sum = 0;//用来表示a+b在转换成i进制后转换成10进制的数
            for(int i = m; i > 0; i--)//我是用的乘以10^n来写的
            {
    
    
                sum += tr.top() * q_pow(10,i-1);
                tr.pop();
            }
            if(sum == c)
            {
    
    
                cout<<j<<endl;
                break;
            }
            else
                huai++;
            k = o;   
        }
    if(huai == 8)
        cout<<-1<<endl;
    return 0;
}

这个题我开始没看清楚题,就发现样例没懂,就拖到第五个才做,卡了我好长时间

B. 77777

B.77777

题意:

就是给你一个字符串,让你找他有没有这个子串,至少有一个英语字母恰好出现7次

思路:

其实就是直接循环遍历一遍,当一个字母出现7次时就直接break掉

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

int main()
{
    
    
    int n, k, m;
    m = 0;
    cin>>n;
    string s;
    cin>>s;
    int tr[100] = {
    
    0};
    for(int i = 0; i < n; i++)
    {
    
    
        int k = s[i] - '0';//这个可以把字符串转换成asc码
        tr[k]++;
        if(tr[k] == 7)
        {
    
    
            m = 1;
            break;
        }

    }
    if(m == 1)
        cout<<"YES"<<endl;
    else
        cout<<"NO"<<endl;

}

C. Merge

C.Merge

题意:

给你n张带权值的卡牌,每次可执行一个操作:选一张卡牌,让它相邻的一张卡牌加或减所选卡牌的权值,并把所选卡牌删掉,求最后剩余的一张卡牌的最大权值。

思路:

如果你考虑周到了,会发现有两种情况,一种是至少出现一个非负数,这个时候我们就可以把这个题看做是所有数的绝对值的和。
第二种情况就是全是负数,这个时候你写一下就知道答案是所有数的绝对值之和再加上最大的数的两倍(因为都是负数,所以最大的也是负数)。

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

int ar[1000060];

bool cmp(ll a,ll b)
{
    
    
    return a>b;
}

int main()
{
    
    
    ll n, m,sum;
    sum = 0;
    ll ma = -1e9-1;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
    
    
        scanf("%lld",&m);
        if(m >= 0)
            sum = sum + m;
        else
            sum = sum - m;
        ma = max(ma, m);
    }
    if(n == 1) printf("%lld",ma);
    else if(ma >= 0) printf("%lld",sum);
    else printf("%lld",sum+ma+ma);
}

这个题是第三个做的,没仔细想透这个题,然后提交了两次都wa了(果断就会白给),然后后来分情况写的,比较复杂,还没保存,ql这个lj提交方法,都不能给我保存代码,害得我周一下午凭记忆来机房打了一遍我提交的代码

D. 魔法少女:承

D.魔法少女:承

题意:

给定每颗高、低纯度结晶的回复理性值和纯粹度,找一种使用高、低纯度结晶的个数,使得理性值回满,平均纯粹度≥ 60 % ,尽可能节约高纯度结晶,其次节约低纯度结晶。

思路:

就是通过两个循环,直接暴力搜索,然后更新最小值

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const ll M = 1000005;

int main()
{
    
    
    ll a1,a2,b1,b2, T;
    cin>>T;
    while(T--)
    {
    
    
        cin>>a1>>b1>>a2>>b2;
        ll t = M;
        ll r = M;
        ll m = 0;
        for(int i = 0; i <= 100; i++)//从0开始,当找到的时候就是在能满足题意的情况下高纯度结晶最小的时候
        {
    
    
            for(int j = 0; j <= 100; j++)
            {
    
    
                if(a1 * i + a2 * j >=100 && (i * b1 + j * b2)/(i + j) >= 60)
                {
    
    
                    if(i < t ||(i == t && j < r))
                    {
    
    
                        t = i;
                        r = j;
                        m = 1;
                        break;
                    }
                }
                if(m == 1) break;
            }
        }
        cout<<t<<" "<<r<<endl;
    }
}

E.学妹的任务

见我的另一个博客 —> TR

F. AKIE’s Penalty

F. AKIE’s Penalty

题意:

给定N个题的提交次数和通过时间,若通过时间T i 为正,则最后一次提交正确,若通过时间T i 为负,则本题未通过,要记住错的时候是不计算罚时的(我开始不知道,所以看不懂样例,后来以身试险,提交了一次wa,发现罚时不变,就一下子就懂了,怎么有点队友祭天法力无边的感觉)。每次错误提交的罚时为20,计算所有通过题目的总罚时。

思路:

没什么思路,就是直接算

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

ll tr[100000];
ll br[100000];

int main()
{
    
    
    ll sum = 0;
    ll n;
    cin>>n;
    for(int i = 0; i < n; i++)
    {
    
    
        scanf("%lld",&tr[i]);
    }
        for(int i = 0; i < n; i++)
    {
    
    
        scanf("%lld",&br[i]);
    }
    for(int i = 0; i < n; i++)
    {
    
    
        if(br[i] != -1)
        {
    
    
            sum += (tr[i] - 1) * 20 + br[i];
        }
    }
    cout<<sum<<endl;
    return 0;
}


G. A-B Problem

好一个水题!

题意:

输入两个数,输出A-B。

思路

…[组织语言中.jpg]

#include<bits/stdc++.h>

using namespace std;
typedef long long ll;

int main()
{
    
    
    int a, b;
    cin>>a>>b;
    cout<<a<<"-"<<b;
    return 0;
}

K. 魔法少女:合

K.魔法少女:合

题意:

分别给定两棵树的所有连边,判断两棵树是否完全相同(节点、连边都相同)。

思路:

刚开始想用二维数组,结果发现二维数组能开的空间太小了,就只能转战结构体,通过两个结构体,都进行两次排序,第一次是输入的(x,y)排小的在前,大的在后,第二次是对整个结构体的元素排序,从小到大排(就是有点麻烦,开两个结构体,通过bool写cmp排序时一个只能针对一个写,就得写俩cmp,里面的变量我怕写一样的时候会报错,就换不同的变量,结果来回看这个是谁的变量,那个是谁的变量就很浪费时间,还好能过oj,不然我能疯)

#include<bits/stdc++.h>

using namespace std;

typedef long long ll;
const int M = 5e5 + 10;

struct tang
{
    
    
    int x;
    int y;
} ta[M];
struct ran
{
    
    
    int p;
    int q;
} ra[M];
bool cmp1(tang c, tang d)
{
    
    
    if(c.x != d.x)
        return c.x < d.x;
    else
        return c.y < d.y;
}
bool cmp2(ran e, ran f)
{
    
    
    if(e.p != f.p)
        return e.p < f.p;
    else
        return e.q < f.q;
}
int main()
{
    
    
    int n;
    cin>>n;
    int a, b;
    for(int i = 1; i < n; i++)
    {
    
    
        scanf("%d%d",&a, &b);
        if(a > b)
            swap(a, b);
        ta[i].x = a;
        ta[i].y = b;
    }
    for(int i = 1; i < n; i++)
    {
    
    
        scanf("%d%d",&a, &b);
        if(a > b)
            swap(a, b);
        ra[i].p = a;
        ra[i].q = b;
    }
    sort(ta + 1, ta + n, cmp1);
    sort(ra + 1, ra + n, cmp2);
    int ans = 1;
    for(int i = 1; i < n && ans; i++)
    {
    
    
        if(ra[i].p != ta[i].x || ra[i].q != ta[i].y)
            ans = 0;
    }
    if(ans)
        cout<<"RED PILL"<<endl;
    else
        cout<<"BLUE PILL"<<endl;
    return 0;
}

总结:

犹豫就会败北,果断就会白给

猜你喜欢

转载自blog.csdn.net/weixin_51216553/article/details/110006972