备考传智杯打卡2(P8828,P8822,P8830,P8195)

备考传智杯的题库:可在洛谷上面的题库中,搜索关键词传智杯,即可!

目录

P8828 [传智杯 #3 练习赛] 直角三角形

P8822 [传智杯 #3 初赛] 课程报名

P8830 [传智杯 #3 练习赛] 评委打分

P8195 [传智杯 #4 决赛] 小智的疑惑


P8828 [传智杯 #3 练习赛] 直角三角形

#include<bits/stdc++.h>    

using namespace std;

int main()

{

    int a,b,c,t=1;

    cin>>c;

    for( a=1;a<=c&&t==1;a++)

    {

        for(b=1;b<c;b++)

        {

            if(a*a+b*b== c*c&&a<=b&&b-a<c)

            {

                 cout<<a<<" "<<b;

                     t=0;

                    break;

            }

        }

    }

    return 0;

}

P8822 [传智杯 #3 初赛] 课程报名

#include <iostream>    

using namespace std;

int main ()

{

    long long n,v,m,a,sum=0,t;

    cin>>n>>v>>m>>a;

    if(n/m==0)

    cout<<n*v;

    else

    {

        for(int i=1;i<=n/m;i++)

        {

            t=a*(i-1);

            sum+=m*(v+t);

        }

        sum+=(n%m)*(v+t+a);

    }

    cout<<sum;

    return 0;

}

P8830 [传智杯 #3 练习赛] 评委打分

//时间超时,时间复杂度太高!!!换思路求解 ~ ~

#include<bits/stdc++.h>    

using namespace std;

const long long N=1e6+10;

int a[N];

int main()

{

    long long n,t,q=0,m;

    double sum=0.0,aver=0.0;

    cin>>n;

    m=n;

    for(int i=0;i<n;i++)

        cin>>a[i];

    while(m--&&m!=1)

    {

        for(int i=0;i<3+q-1 && 3+q<=n;i++)  

            for(int j=0;j<3+q-1-i;j++)

            {

                if(a[j]>a[j+1])

                {

                    t=a[j];

                    a[j]=a[j+1];

                    a[j+1]=t;

                }

               

            }

        for(int p=1;p<2+q;p++)

        {

            sum+=a[p];

        }

        aver=sum/(1+q);

        cout<<fixed<<setprecision(2)<<aver<<endl;

        q++;

        sum=0.0;

        aver=0.0;

    }

    return 0;

}

正解:

#include<bits/stdc++.h>     

using namespace std;

const int N=1e6+10;

int a[N];

int main()

{

    long long n;

    int maxp=0,minp=101;

    double sum=0.0,aver;

    cin>>n;

    for(int i=0;i<n;i++)

    {

        cin>>a[i];

        maxp=max(a[i],maxp);

        minp=min(a[i],minp);

        sum+=a[i];

        if(i>=2&&i<n)

        {

            aver=(sum-maxp-minp)/(i-1);

            cout<<fixed<<setprecision(2)<<aver<<endl;

        }

    }

    return 0;

}

P8195 [传智杯 #4 决赛] 小智的疑惑

#include<bits/stdc++.h>    

using namespace std;

char s[400010];

long long sum=0;

int main()

{

    cin>>s;

    if(strlen(s)<8)

        cout<<sum;

    else

    {

        for(int i=0;i<strlen(s)-7;i++)

        {

            if(s[i]=='c'&&s[i+1]=='h'&&s[i+2]=='u'&&s[i+3]=='a'&&s[i+4]=='n'&&s[i+5]=='z'&&s[i+6]=='h'&&s[i+7]=='i')

            sum++;

        }

        cout<<sum<<endl;

    }

    return 0;

}

每日打卡,和大家共同进步!!

### 关于 P6464 #2 决赛 送门 树形动态规划 题解 #### 背景描述 题目涉及 n 座教学楼以及 m 条连接这些教学楼的双向道路,形成了一张无向图。目标是在这张图上执行特定的操作并求得最优解。 #### 解决方案概述 对于此类问题,通常采用树形动态规划 (Tree DP) 方法来解决。该方法适用于具有层次结构的数据集,在本案例中即为由教学楼构成的网络拓扑结构[^1]。 #### 动态规划状态定义 设 `f[u][i]` 表示以节点 u 作为根结点的子树内选择了 i 所能获得的最大价值,则可以建立如下转移方程: ```cpp for each child v of node u { for j from size[v] downto 0 { // 反向枚举防止重复计算 f[u][j + k] = max(f[u][j + k], f[u][j] + f[v][k]); } } ``` 这里假设已知所有孩子节点的状态,并通过上述方式更新父节点的状态。其中 `size[]` 数组记录各棵子树大小以便控制循环边界。 #### 边界条件处理 初始化时需考虑叶子节点的情况,一般设定其初始值为零或其他适当常数,具体取决于实际问题需求。另外还需注意特判仅有单个顶点的情形。 #### 复杂度分析 由于每次访问每条边两次(一次正向一次反向),因此时间复杂度大致为 O(n),这使得算法能够在合理时间内完成较大规模输入实例的运算。 #### 实现细节提示 - 使用邻接表存储图的信息; - 运用深度优先搜索遍历整棵树; - 记录每个节点及其对应子树内的最佳选择情况。 ```cpp #include <bits/stdc++.h> using namespace std; const int N = ...; vector<int> adj[N]; int dp[N]; void dfs(int u, int parent){ for(auto &v : adj[u]){ if(v != parent){ dfs(v, u); // 更新当前节点u的最佳决策 } } } int main(){ cin >> n >> m; while(m--){ int a,b; cin>>a>>b; adj[a].push_back(b); adj[b].push_back(a); } memset(dp, 0, sizeof(dp)); dfs(1,-1); // 假定第一个节点为根 cout << "最终结果:" << endl; return 0; } ```
评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值