牛客小白月赛92VP(A--F)

NowcoderACM比赛中的C++编程挑战与解题策略

题目质量很好,尤其是F题,收获很多。

1.签到:https://ac.nowcoder.com/acm/contest/81126/A

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int x;
int main()
{
    cin>>x;
    cout<<8*x;
}

2.模拟:https://ac.nowcoder.com/acm/contest/81126/B

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,h;
string a[5];
int b[2];
int main()
{
    cin>>n>>h;
    for(int i=1;i<=5;i++) cin>>a[i-1];
    for(int i=0;i<=n-1;i++)
    {
        if(a[0][i]=='*'&&a[1][i]=='*') b[0]++;
        else if(a[0][i]=='*') b[1]++;
        else continue;
    }
   for(int i=0;i<=n-1;i++) b[0]+=(a[1][i]=='*');
    for(int i=0;i<=n-1;i++) b[0]+=(a[3][i]=='*');
    for(int i=0;i<=n-1;i++)
    {
        if(a[4][i]=='*'&&a[3][i]=='*') b[0]++;
        else if(a[4][i]=='*') b[1]++;
        else continue;
    }
    if(h<=b[0]) cout<<h;
    else{
        cout<<b[0]+min(b[1],(h-b[0])/2);
    }
}

3.模拟:https://ac.nowcoder.com/acm/contest/81126/C

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
int n,a[100010],x;
long long ans1[100000];
bool cmp(int a,int b)
{
    return a>b;
}
long long ans=0;
int calc(int w,int cnt)
{
    if(w<x) return -1;
    if(w==x)
    {
        return cnt;
    }
    return calc((w+2)/3,cnt+1);
}
int qpow(int a,int b)
{
    int res=1;
    while(b)
    {
        if(b&1) res=res*a;
        a=a*a;
        b>>=1;
    }
    return res;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
    cin>>x;
    sort(a+1,a+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        if(a[i]<x) break;
        int w=calc(a[i],0);
        if(w==-1) continue;
        ans1[w]+=qpow(2,w);
    }
   for(int i=0;i<=100;i++) ans=max(ans,ans1[i]);
    cout<<ans;
}

4.数学:https://ac.nowcoder.com/acm/contest/81126/D

把式子拆开来就可以了,下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1e5+10;
int n;
ll a[N];
int main(){
    cin>>n;
    for(int i=1;i<=n;++i){
        cin>>a[i];
    }
    ll x=0,y=0,z=0;
    for(ll i=1;i<=n;++i){
        x+=a[i];
        y+=2*i*a[i];
        z+=i*i*a[i];
    }
    ll ans=0x3f3f3f3f3f3f3f3f;
    for(ll i=1;i<=n;++i){
        ans=min(ans,i*i*x-i*y+z);
    }
    cout<<ans<<endl;
}

5.DP:https://ac.nowcoder.com/acm/contest/81126/E

我们令dp[i][j][k]表示用前i个煤炭烧j个铁矿石用k次魔法的最短时间,接下来就是比较常规的转移,这里注意下vector来代替数组。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int n,m,x,y;
int main()
{
    cin>>n>>m;
    vector<long long> x(n+5),y(n+5);
    vector<vector<vector<long long> > > dp(n+1,vector<vector<long long>>(m+1,vector<long long>(2,1e16)));
    dp[0][0][0]=dp[0][0][1]=0;
    for(int i=1;i<=n;i++) cin>>x[i]>>y[i];
    for(int i=1;i<=n;i++)
    {
        for(int j=0;j<=m;j++)
        {
            dp[i][j][0]=dp[i-1][j][0];
            dp[i][j][1]=dp[i-1][j][1];
            dp[i][j][0]=min(dp[i][j][0],dp[i-1][max((ll)0,j-x[i])][0]+y[i]);
            dp[i][j][1]=min(dp[i][j][1],dp[i-1][max(0ll,j-x[i])][1]+y[i]);
            dp[i][j][1]=min(dp[i][j][1],dp[i-1][max(0ll,j-2*x[i])][0]+y[i]/2);
        }
    }
    cout<<min(dp[n][m][0],dp[n][m][1]);
}

注意这里的1e16就是为其赋初值的。

6.差分:https://ac.nowcoder.com/acm/contest/81126/F

这里还有一个比较秒的点就是用map<int,vector<int>>实现了在多条用重叠的边的差分操作。

下面是AC代码:

#include<bits/stdc++.h>
using namespace std;
#define int long long
int n,m,w[100010],v[100010],x[100010];
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>w[i];
        w[i]+=w[i-1];
    }
    for(int i=1;i<=n;i++) cin>>v[i];
    for(int i=1;i<=m;i++) cin>>x[i];
    map<int,vector<int> > mp;
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=m;j++)
        {
            mp[w[i-1]+1-x[j]].push_back(v[i]);
            mp[w[i]+1-x[j]].push_back(-v[i]);
        }
    }
    int now=0;
    set<int> st;
    st.insert(0);
    for(auto [k,v]:mp)
    {
        for(auto dd:v)
        {
            now+=dd;
        }
        st.insert(now);
    }
    cout<<st.size();
}

根据用户提供的关键词“小A 弹吉他 牛客牛客网 小白 108 比详情 参攻略”,以下是整合后的相关信息和建议: --- ### 关于小白108的比详情 小白是由牛客网主办的一系列面向编程爱好者的在线竞之一。第108场事通常会围绕算法数据结构以及实际问题解决能力展开挑战。比题目可能涉及但不限于字符串处理、动态规划图论等领域。 对于与“小A弹吉他”相关的具体题目,可能是某道以音乐或乐器为主题的趣味性算法题。这类题目往往需要结合数学建模能力和逻辑推理技巧来完成解答。 --- ### 如何准备此类比? #### 方法一:熟悉常见算法模板 确保掌握基础的数据结构(如栈、队列)及经典算法模型(例如深度优先搜索DFS、广度优先搜索BFS)。针对可能出现的音符序列匹配或者节奏计算等问题提前复习KMP模式匹配法等相关知识点。 #### 方法二:模拟真实考场环境练习 利用过往的小白记录进行刷题训练,在规定时间内尝试独立解决问题从而提升临场发挥水平。同时注意控制提交频率避免因超时错误而扣分过多。 #### 方法三:学习优秀选手思路分享 访问牛客社区查看往届高排名玩家的经验贴。他们可能会提到如何快速理解复杂描述型试题的方法论;也可能提供一些特别好用但容易被忽略掉的小技巧比如调试输出设置等细节优化方案。 --- ### 示例代码片段供参考(假设存在一个简单版本的问题) 如果遇到类似判断两个旋律是否相同类型的程序设计,则可以考虑如下实现方式: ```python def is_same_melody(melody_a, melody_b): return melody_a == melody_b melody_A = list(map(int, input().split())) melody_B = list(map(int, input().split())) if len(melody_A) != len(melody_B): print("No") else: if is_same_melody(melody_A,melody_B): print("Yes") else: print("No") ``` 此段落仅为示意用途,请依据实际情况调整适应不同难度等级下的业务场景需求。 ---
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值