牛客小白月赛56 ABCDEF

https://ac.nowcoder.com/acm/contest/39100
A-阿宁的柠檬

题目描述 
阿宁喜欢吃柠檬。已知每个柠檬酸度可能是 1到 a,甜度可能是 0 到 b。

现在阿宁有 n 个柠檬,她要全部吃掉,会获得一定的快乐值。快乐值为每个柠檬的酸度和甜度总和。

阿宁最小的快乐值和最大的快乐值可能是多少?
示例1
输入
2 3 4
输出
4 20
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        LL a,b,n;
        cin>>a>>b>>n;
        cout<<n<<" "<<(a+b)*n<<endl;
    }
    return 0;
}

B-阿宁与猫咪

题目描述 
阿宁对自己施展隔音膜法。该膜法需要构造一个正整数数组 a,需要满足 a 数组的所有数总和等于 m。

假设 a 数组的奇数位的数的乘积为 u,偶数位的数的乘积为 v,阿宁烦躁值为 u + v。

奇数位的数指第1,3,5 ...个数,偶数位的数指第2,4,6 ...个数。

如果不存在奇数位的数,u 视为 0,如果偶数位的数不存在,则 v 视为 0。

阿宁想施展膜法使得她的烦躁值最小,问构造的数组是什么?

如果有多解,输出任意一解即可。
示例1
输入
1
输出
1
1

示例2
输入
2
输出
1
2
输出其中一解即可。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        cout<<n<<endl;
        for(int i=1;i<=n;i++)
            cout<<"1 ";
        cout<<endl;
    }
    return 0;
}

C-阿宁吃粽子

题目描述 
阿宁的公司给阿宁发了各种口味的粽子。
一共有 n 条粽子,每条粽子有个美味值ai.
阿宁想立即吃下全部。吃下第 k 条粽子时,该粽子的美味值是 x,阿宁获得 2^(k mod10) *x 的愉悦值。(k从1开始)

如果有多解,请把美味值较大的粽子,安排到后面。(好吃的留到后面)
示例1
输入
3
3 1 2
输出
1 2 3

示例2
输入
12 
4 4 4 3 3 3 2 2 2 1 1 1
输出
1 2 2 3 3 3 4 4 4 1 1 2

#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const LL N=2002002,M=2002;
LL a[N],b[N];
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    LL T=1;
    //cin>>T;
    while(T--)
    {
        LL n;
        cin>>n;
        for(LL i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        LL be=10;
        if(n<10) be=1;
        for(LL i=1;i<=n;i++)
        {
            b[be]=a[i];
            if(be+10<=n) be+=10;
            else be=(be%10+1);
        }
        for(LL i=1;i<=n;i++)
            cout<<b[i]<<" ";
    }
    return 0;
}

D-阿宁的质数

题目描述 
阿宁有一个长度为 n 的正整数数组 a,她有q次询问,每次询问:在数组 a 的前 x 个数中,未出现的最小质数是多少?
示例1
输入
5 5
8 2 3 6 5
1
2
3
4
5
输出
2
3
5
5
7
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
const int N=2e7;
int a[N],res[N];
int primes[N],cnt=0;
bool st[N];
int vis[N];
void get_primes(int n)//线性筛法求素数
{
    for(int i=2;i<=n;i++)
    {
        if(!st[i]) primes[cnt++]=i;//素数进入primes数组
        for(int j=0;primes[j]<=n/i;j++)
        {
            st[primes[j]*i]=true;//非素数利用bool数组st标记true
            if(i%primes[j]==0) break;
        }
    }
}
int main()
{
    get_primes(3000000);//线性筛法求素数
    /*for(int i=0;i<=100;i++)
        cout<<primes[i]<<" ";
    cout<<endl;*/
    int n,q;
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    int idx=0;
    for(int i=1;i<=n;i++)
    {
        if(a[i]<=30000000)//删掉的话会出现段错误
            vis[a[i]]=1;
        while(vis[primes[idx]]>0&&idx<=cnt) idx++;
        res[i]=primes[idx];
    }
    while(q--)
    {
        int x;
        cin>>x;
        cout<<res[x]<<endl;
    }
    return 0;
}

E-阿宁睡大觉

题目描述 

她睡觉时会产生字符串 s,计算出她的睡觉质量为 ∑ [i=1到len(s)−1] w(si)× w(si+1)。
其中定义 w(z)=0,w(Z)=2。(前者小写后者大写)

为了睡一个好大觉,阿宁使用了预测膜法知道 s 串,然后她可以最多使用 k 次del膜法。使用一次del膜法可以删除 s 串的一个字符。

阿宁想知道睡觉质量的最大值是多少?
示例1
输入
3 2
ZzZ
输出
4

示例2
输入
3 2
zzz
输出
0
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<int,int> PII;
const int N=200200,M=2002;
int main()
{
    cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        LL n,k;
        cin>>n>>k;
        string s;
        cin>>s;
        int l=-1;
        for(int i=0;i<s.size();i++)
        {
            if(s[i]=='Z')
            {
                l=i;
                break;
            }
        }
        vector<int> v;
        for(int i=l+1;i<s.size();i++)
        {
            if(s[i]=='Z')
            {
                v.push_back(i-l-1);
                l=i;
            }
        }
        /*cout<<v.size()<<endl;
        for(int i=0;i<v.size();i++)
            cout<<v[i]<<" ";
        cout<<endl;*/
        sort(v.begin(),v.end());//这里其实还隐藏了一个
        int sum=0;
        for(int i=0;i<v.size();i++)
        {
            if(k>=v[i])
            {
                k-=v[i];
                sum+=4;
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

F-阿宁去游玩

题目描述 
阿宁打算下次放假去游玩。一共有 n 个城市, 阿宁住在 1 号城市,去到 n 号城市游玩。

城市有两种属性,一种是炎热,另一种是酷寒,每个城市是其中一种。

从一个城市前往另一个城市,如果要前往的城市和当前城市的属性相同,则需要 x 时间,否则需要 y 时间。

阿宁可以使用倒转膜法,该膜法可以使所有城市(除了阿宁当前所在的城市)的属性变化(炎热变酷寒,酷寒变炎热),花费 z 时间。

倒转膜法可以使用任意次。

阿宁想尽快去到 n 号城市游玩,她想知道她最少需要多少时间到达目的地?

输出描述:
一个整数,表示阿宁从 11 号城市到达 nn 号城市所需要的最少时间。
示例1
输入
5 6
1 3 9
1 0 0 1 1
1 2
1 3
2 3
2 4
3 4
4 5
输出
7
说明
路径 1->3->4->5,花费时间为 3+3+1=7。

示例2
输入
3 3
1 10 2
0 1 1
1 2
1 3
2 3
输出
3
说明
在 1 号城市使用一次倒转膜法,路径 1->3,花费时间为 2+1=3。
#include<bits/stdc++.h>
using namespace std;
typedef long long LL;
typedef pair<LL,LL> PII;
const LL N=200200,M=2002;
LL n,m,x,y,z;
LL nums[N*2],dist[N*2];
LL e[N*2],w[N*2],ne[N*2],h[N*2],idx;
bool st[N*2];
void add(int a,int b,int c)
{
    e[idx]=b,w[idx]=c,ne[idx]=h[a],h[a]=idx++;
}
LL dij()
{
    memset(dist,0x3f,sizeof dist);
    dist[1]=0;
    priority_queue<PII,vector<PII>,greater<PII>> heap;
    heap.push({0,1});
    while(heap.size())
    {
        auto t=heap.top();
        heap.pop();
        LL distance=t.first,ver=t.second;
        if(st[ver]) continue;
        st[ver]=true;
        for(LL i=h[ver];i!=-1;i=ne[i])
        {
            LL j=e[i];
            if(dist[j]>distance+w[i])
            {
                dist[j]=distance+w[i];
                heap.push({dist[j],j});
            }
        }
    }
    return dist[n];
}
int main()
{
    //cin.tie(0); cout.tie(0); ios::sync_with_stdio(false);
    int T=1;
    //cin>>T;
    while(T--)
    {
        memset(h,-1,sizeof h);
        cin>>n>>m;
        cin>>x>>y>>z;
        x=min(x,y+z);
        y=min(y,x+z);
        for(LL i=1;i<=n;i++)
            cin>>nums[i];
        for(LL i=1;i<=m;i++)
        {
            LL a,b;
            cin>>a>>b;
            if(nums[a]==nums[b])
            {
                add(a,b,x);
                add(b,a,x);
            }
            else
            {
                add(a,b,y);
                add(b,a,y);
            }
        }
        dij();
        cout<<dist[n]<<endl;
    }
    return 0;
}
posted @ 2022-08-29 23:20  Vijurria  阅读(121)  评论(0编辑  收藏  举报