NYNU ACM 蓝桥杯选拔赛 解题报告

本文分享了参加NYNU ACM蓝桥杯选拔赛的解题经验,涉及A到J共10道题目。题目类型包括算法优化、排序、暴力搜索、数学规律、模拟、数论、线段树等。解题策略包括设置指针扫描、暴力枚举、贪心算法等。部分题目提供了解题思路,如A题通过公式求解最优方案,B题运用双指针解决排序问题。
摘要由CSDN通过智能技术生成

内网比赛 后面几题自己看课本 一下题解为外网和内网前几题题解

A
这题需要考虑的问题是:该怎样放人、载人才能到达B地且时间最少,仔细想想,只用在某一个地方放人下去(就是说只用交换一次)。

现在的问题就变为了:该在哪个地方放人下去,带回终点,两人一起到终点,时间最少(首先车带一个人行驶一段距离然后丢下,折回找另外一个人,半路碰上,带回终点刚好与第一人共到B点)

这样问题就好解决了,设那个放下的点为x,那么就有:(s-x)/a=2*(2*x/(a+b)-x/b)+(s-x)/b

化简得:x=(b+a)*s/(b+3a)

既然放下的那个点已经确定好了,那么时间也简单了,时间为:x/b+(s-x)/a,(x/b)为那个点前一段所用的时间,[(s-x)/a]为那个点后一段所用的时间。

#include<bits/stdc++.h> 
using namespace std;
int main(){
    double n, a, b;
    scanf("%lf%lf%lf", &n, &a, &b);
    double m = (b + a)/(b - a);
    double x = 2 * m + 1;
    double y = 2 * a * m + 2 * a + b;
    double t = x * n / y;
    printf("%.6f\n", t); 
    return 0;
}

B

排序 设置两个指针 一个从头一个从尾部 向中间扫描 看有几种方案

#include <iostream>
#include <algorithm>
using namespace std;
#define mo 1000005
int a[mo];


int main()
{
    int n,m;
    while(cin>>n>>m)
    {
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }

        sort(a,a+n);
        int l=0,r=n-1;
        int ans=0;
        int sum=0,k=0;
        while(l<=r)
        {
            ans=0;
            for(;r>l;r--)
            {
                if(ans+a[r]<=m) ans+=a[r];
                else break;
            }


            for(;l<=r;l++)
            {
                if(ans+a[l]<=m) ans+=a[l];
                else break;
            }
            sum+=m-ans;
            k++;
        }
        cout<<sum<<' '<<k<<endl;
    }
}

C
暴力搜索

#include<iostream>
#include<string>
#include <algorithm>
#include <cstring>
#include <cmath>
#include <map>
#include <cstdio>
using namespace std;
int d[10];
int tag[10];
int sum;
int dp[10000005];
void run()
{
    int x=0,y=0,z=0;
    for(int i=1;i<=9;i++)
    {
        x=x*10+tag[i];
        y=0;
        for(int j=i+1;j<=9;j++)
        {
            y=y*10+tag[j];
            z=0;
            //cout<<i<<' '<<j<<' '<<endl;
            if(j-i>=9-j&&j<9)
            {
                for(int k=j+1;k<=9;k++)
                {
                    z=z*10+tag[k];
                }
               //cout<<x<<' '<<y<<' '<<z<<' '<<x<<' '<<y/z<<endl;
               if(z==0||y<z) continue;
               if(y%z==0) dp[x+y/z]++;
            }
        }
    }
}
void bfs(int t,int x,int s)
{
    tag[x]=s;
    if(t==9)
    {
        run();
        //for(int i=1;i<=9;i++)cout<<tag[i]<<' ';cout<<endl;
        sum++;
    }
    for(int i
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值