2020.10.16VJ training

A - Juggling Letters

题意:给你n个字符串,可以重新组合排列,问能不能凑出来n个完全一样的字符串。

思路:只要能每一种字母的个数能被n整除,也就是能平分成n份就可以了。

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
int a[26];
int main()
{
    ll t;
    cin>>t;
    while(t--)
    {
        memset(a,0,sizeof(a));
        int n;
        cin>>n;
        string s;
        for(int i = 0;i < n;i++)
        {
            cin>>s;
            for(int j = 0;j < s.length();j++)
            {
                a[s[j]-'a']++;
            }
        }
        int flag = 1;
        for(int i = 0;i < 26;i++)
        {
            if(a[i]%n!=0)
                flag = 0;
        }
        if(flag)
        cout<<"YES"<<endl;
        else cout<<"NO"<<endl;
    }
}

B - Power Sequence

题意:给你个数列,你可以调换顺序,或者数据,每一次加一都会花费1,求让它变成c的i次方最小花费的c。

思路:暴力枚举c。

#include<bits/stdc++.h>
using namespace std;
long long fastPower(long long base,long long power)
{
    long long res = 1;
    while(power)
    {
        if(power%2==1)
        {
            res = res*base;

        }
        power/=2;
        base = base*base;
    }
    if(base == 0)
        return 0;
    return res;
}//快速幂没用上
int main()
{
    int n;
    cin>>n;
    int a[n+1];
    int i;
    long long ans,t;
    long long res = 1e18;
    for(i = 0;i < n;i++)cin>>a[i];
    sort(a,a+n);

    for(int c = 1;;c++)
    {
        long long sum = 0 ,t = 1;
        for(i = 0;i < n;i++)
        {
            sum+=abs(a[i]-t);
            t = t*c;
            if(t>=1e15)
            {
                t = -1;
                break;
            }
        }
        if(t==-1)
        {
            break;
        }
        else res = min(res,sum);
    }
    cout<<res<<endl;

}

D - Drinks Choosing

题意:n个人,k套饮料瓶子,一个瓶子能装两瓶同种饮料,问最多能给多少人喝到自己喜欢的饮料。

思路:先就着偶数人的人喝,如果还剩再给奇数,因为奇数的人肯定会浪费一个瓶子。

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
int a[1001];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    int n,k;
    cin>>n>>k;
    int num;//盒的数量
    if(n%2==0)
        num = n/2;
    else num = n/2+1;
    int i;
    for(i = 0; i < n; i++)
    {
        int t;
        cin>>t;
        a[t]++;
    }
    sort(a+1,a+k+1,cmp);
    int cnt = 0;
    for(int i = 1; i<=k; i++)
    {
        if(a[i]%2==0&&a[i]!=0)
        {

            while(a[i]>0&&num>0)
            {
                num--;
                cnt+=2;
                a[i]-=2;
            }
        }
        else if(a[i]%2!=0&&a[i]!=0)
        {
            while(a[i]>1&&num>0)
            {
                num--;
                cnt+=2;
                a[i]-=2;
            }
        }
    }
    cout<<cnt+num<<endl;
}

E - Sport Mafia

题意:先放一个糖在盒子里,然后可以进行两种操作:一是吃掉一个糖,二是往盒子里放糖,每次放的糖要比上次多,问n此操作之后能吃多少糖。

思路:二元一次方程组,设x是操作一,y是操作二可以得到:

x+y = n;y(y+1)/2-x = k;

#include<iostream>
#include<cmath>
#include<cstring>
#include<algorithm>
#include<set>
#include<map>
#include<vector>
using namespace std;
typedef long long ll;
int a[1001];
bool cmp(int a,int b)
{
    return a>b;
}
int main()
{
    ll n,k;
    cin>>n>>k;
    ll delta = (2*n+3)*(2*n+3)-4*(n*n+n-2*k);
    ll res = ((2*n+3)-sqrt(delta))/2;
    cout<<res<<endl;
}
全部评论

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务