NEUQ-ACM week11 复习巩固

文章包含一系列编程题目,主要涉及路径规划、计数、称重和环境治理等主题。题目要求找到从低等级星球到高等级星球的最低费用航线,计算跑步的不同方式,确定砝码组合的最大称重方式,找出最大正方形的圆柱布局以及通过城市道路改善达到环境治理目标的最少天数。
摘要由CSDN通过智能技术生成

P1796 汤姆斯的天堂梦

题目描述

汤姆斯生活在一个等级为 0 的星球上。那里的环境极其恶劣,每天 12 小时的工作和成堆的垃圾让人忍无可忍。他向往着等级为 N 的星球上天堂般的生活。

有一些航班将人从低等级的星球送上高一级的星球,有时需要向驾驶员支付一定金额的费用,有时却又可以得到一定的金钱。

汤姆斯预先知道了从 0 等级星球去 N 等级星球所有的航线和需要支付(或者可以得到)的金钱,他想寻找一条价格最低(甚至获得金钱最多)的航线。

输入格式

第一行一个正整数 NN≤100),接下来的数据可分为 N 个段落,每段的第一行一个整数 KiKi≤100),表示等级为 i 的星球有 Ki 个。

接下来的 Ki 行中第 j 行依次表示与等级为 i,编号为 j 的星球相连的等级为i−1 的星球的编号和此航线需要的费用(正数表示支出,负数表示收益,费用的绝对值不超过 1000)。

每行以 0 结束,每行的航线数 ≤100。

输出格式

输出所需(或所得)费用。正数表示支出,负数表示收益。

输入输出样例

输入 #1复制

3

2

1 15 0

1 5 0

3

1 -5 2 10 0

1 3 0

2 40 0

2

1 1 2 5 3 -5 0

2 -19 3 -20 0

输出 #1复制

-1

说明/提示

对于100% 的数据,1≤N≤100,1≤Ki≤100。

样例解释:

#include<bits/stdc++.h>
using namespace std;
int N,k,n,v,dp[105][105],ans=999999;
int main()
{
    cin>>N;
    for(int i=1;i<=N;i++)
    {
        cin>>k;
        for(int j=1;j<=k;j++)dp[i][j]=999999;
        for(int j=1;j<=k;j++)
        {
            cin>>n;
            while(n!=0)
            {
                cin>>v;
                dp[i][j]=min(dp[i-1][n]+v,dp[i][j]);
                cin>>n;
            }
        }
    }
    for(int i=1;i<=k;i++)ans=min(ans,dp[N][i]);
    cout<<ans;
    return 0;
}

P1806 跑步

题目描述

路人甲准备跑 n 圈来锻炼自己的身体,他准备分多次(>1)跑完,每次都跑正整数圈,然后休息下再继续跑。

为了有效地提高自己的体能,他决定每次跑的圈数都必须比上次跑的多。

可以假设他刚开始跑了 0 圈,那么请问他可以有多少种跑完这 n 圈的方案?

输入格式

一行一个整数,代表 n

输出格式

一个整数表示跑完这 n 圈的方案数。

输入输出样例

输入 #1复制

212

输出 #1复制

995645335

说明/提示

数据规模与约定

对于 100% 的数据,保证5≤n≤500。

#include<bits/stdc++.h>
using namespace std;
int n;
long long dp[505];
int main()
{
    cin>>n;
    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        for(int j=n;j>=i;j--)dp[j]+=dp[j-i];
    }
    cout<<dp[n]-1;
}

P8742 [蓝桥杯 2021 省 AB] 砝码称重

题目描述

你有一架天平和 N 个砝码, 这 N 个砝码重量依次是 W1,W2,⋯,WN 。 请你计算一共可以称出多少种不同的重量?

注意砝码可以放在天平两边。

输入格式

输入的第一行包含一个整数 N

第二行包含 N 个整数: W1,W2,W3,⋯,WN

输出格式

输出一个整数代表答案。

输入输出样例

输入 #1复制

3

1 4 6

输出 #1复制

10

说明/提示

【样例说明】

能称出的 10 种重量是: 1 、 2 、 3 、 4 、 5 、 6 、 7 、 9 、 10 、 111、2、3、4、5、6、7、9、10、11 。

【评测用例规模与约定】

对于 50% 的评测用例, 1≤N≤15 。

对于所有评测用例, 1≤N≤100,N 个砝码总重不超过 10^5105。

蓝桥杯 2021 第一轮省赛 A 组 F 题(B 组 G 题)。

#include<bits/stdc++.h>
using namespace std;
int n,dp[500005],a[105],sum,ans;
int main()
{
    cin>>n;
    dp[0]=1;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=sum;j>=a[i];j--)
        {
            if(dp[j-a[i]])
            {
//                cout<<j-a[i]<<"+"<<a[i]<<endl;
                dp[j]=1;
            }
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=sum-a[i];j++)
        {
            if(dp[j+a[i]])
            {
//                cout<<j+a[i]<<"-"<<a[i]<<endl;
                dp[j]=1;
            }
        }
    }
    for(int i=1;i<=sum;i++)ans+=dp[i];
    cout<<ans;
}

P1959 遗址

题目描述

很久很久以前有一座寺庙,从上往下看寺庙的形状正好是一个正方形,由 44 个角上竖立的圆柱搭建而成。现在圆柱都倒塌了,只在地上留下圆形的痕迹,可是现在地上有很多这样的痕迹,专家说一定是最大的那个。

写一个程序,给出圆柱的坐标,找出由 44 个圆柱构成的最大的正方形,因为这就是寺庙的位置,要求计算出最大的面积。注意正方形的边不一定平行于坐标轴。

例如图有 1010 根柱子,其中 (4,2),(5,2),(5,3),(4,3)(4,2),(5,2),(5,3),(4,3) 可以形成一个正方形,(1,1),(4,0),(5,3),(2,4)(1,1),(4,0),(5,3),(2,4) 也可以,后者是其中最大的,面积为 1010。

输入格式

第一行包含一个N(1≤N≤3000),表示柱子的数量。

接下来 N 行,每行有两个空格隔开的整数表示柱子的坐标(坐标值在 0 到5000 之间),柱子的位置互不相同。

输出格式

如果存在正方形,输出最大的面积,否则输出 0。

输入输出样例

输入 #1复制

10

9 4

4 3

1 1

4 2

2 4

5 8

4 0

5 3

0 5

5 2

输出 #1复制

10

说明/提示

【数据范围】

30% 满足:1≤N≤100。

60% 满足:1≤N≤500。

100% 满足:1≤N≤3000。

#include<bits/stdc++.h>
using namespace std;
int n,ans,m[5005][5005];
struct point
{
    int x,y;
}p[3005];
bool check(int x,int y)
{
    return (x<0||x>5000||y<0||y>5000);
}
bool cmp(point a,point b)
{
    return a.x<b.x;
}
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>p[i].x>>p[i].y;
        m[p[i].x][p[i].y]=1;
    }
    sort(p+1,p+1+n,cmp);
    for(int i=1;i<=n;i++)
    {
        for(int j=i+1;j<=n;j++)
        {
            int dx,dy,x1,x2,y1,y2;
            if(i==j)continue;
            dx=p[i].x>p[j].x?(p[i].x-p[j].x):(p[j].x-p[i].x);
            dy=p[i].y>p[j].y?(p[i].y-p[j].y):(p[j].y-p[i].y);
            x1=p[i].x+dy,x2=p[j].x+dy;
            if(p[i].y<p[j].y)
            {
                y1=p[i].y-dx,y2=p[j].y-dx;
                if(check(x1,y1)||check(x2,y2))continue;
                if(m[x1][y1]&&m[x2][y2])
                {
                    ans=max(ans,dx*dx+dy*dy);
                }
            }
            else
            {
                y1=p[i].y+dx,y2=p[j].y+dx;
                if(check(x1,y1)||check(x2,y2))continue;
                if(m[x1][y1]&&m[x2][y2])
                {
                    ans=max(ans,dx*dx+dy*dy);
                }
            }
        }
    }
    cout<<ans;
}

P8794 [蓝桥杯 2022 国 A] 环境治理

题目描述

LQ 国拥有 n 个城市,从 0 到 n−1 编号,这 n 个城市两两之间都有且仅有一条双向道路连接,这意味着任意两个城市之间都是可达的。每条道路都有一个属性 D,表示这条道路的灰尘度。当从一个城市 A 前往另一个城市 B 时,可能存在多条路线,每条路线的灰尘度定义为这条路线所经过的所有道路的灰尘度之和,LQ 国的人都很讨厌灰尘,所以他们总会优先选择灰尘度最小的路线。

LQ 国很看重居民的出行环境,他们用一个指标 P 来衡量 LQ 国的出行环境,P 定义为:

P=i=0∑n−1j=0∑n−1d(i,j)

其中 d(i,j) 表示城市 i 到城市j 之间灰尘度最小的路线对应的灰尘度的值。

为了改善出行环境,每个城市都要有所作为,当某个城市进行道路改善时,会将与这个城市直接相连的所有道路的灰尘度都减少 1,但每条道路都有一个灰尘度的下限值 L,当灰尘度达到道路的下限值时,无论再怎么改善,道路的灰尘度也不会再减小了。

具体的计划是这样的:

  • 第 1 天,0 号城市对与其直接相连的道路环境进行改善;

  • 第 2 天,1 号城市对与其直接相连的道路环境进行改善;

……

  • n 天,n−1 号城市对与其直接相连的道路环境进行改善;

  • n+1 天,0 号城市对与其直接相连的道路环境进行改善;

  • n+2 天,1 号城市对与其直接相连的道路环境进行改善;

……

LQ 国想要使得 P 指标满足 PQ。请问最少要经过多少天之后,P 指标可以满足 PQ。如果在初始时就已经满足条件,则输出 0;如果永远不可能满足,则输出 −1。

输入格式

输入的第一行包含两个整数 n,Q,用一个空格分隔,分别表示城市个数和期望达到的 P 指标。

接下来 n 行,每行包含 n 个整数,相邻两个整数之间用一个空格分隔,其中第 i 行第 j 列的值 Di,j(Di,j=Dj,i,Di,i=0) 表示城市 i 与城市 j 之间直接相连的那条道路的灰尘度。

接下来 n 行,每行包含 n 个整数,相邻两个整数之间用一个空格分隔,其中第 i 行第 j 列的值Li,j(Li,j=Lj,i,Li,i=0) 表示城市 i 与城市 j 之间直接相连的那条道路的灰尘度的下限值。

输出格式

输出一行包含一个整数表示答案。

输入输出样例

输入 #1复制

3 10

0 2 4

2 0 1

4 1 0

0 2 2

2 0 0

2 0 0

输出 #1复制

2

说明/提示

【样例说明】

初始时的图如下所示,每条边上的数字表示这条道路的灰尘度:

此时每对顶点之间的灰尘度最小的路线对应的灰尘度为:

  • d(0,0)=0,d(0,1)=2,d(0,2)=3;

  • d(1,0)=2,d(1,1)=0,d(1,2)=1;

  • d(2,0)=3,d(2,1)=1,d(2,2)=0。

初始时的 PP 指标为(2+3+1)×2=12,不满足PQ=10;

第一天,0 号城市进行道路改善,改善后的图示如下:

注意到边(0,2) 的值减小了 1,但(0,1) 并没有减小,因为 L0,1=2 ,所以(0,1) 的值不可以再减小了。此时每对顶点之间的灰尘度最小的路线对应的灰尘度为:

  • d(0,0)=0,d(0,1)=2,d(0,2)=3,

  • d(1,0)=2,d(1,1)=0,d(1,2)=1,

  • d(2,0)=3,d(2,1)=1,d(2,2)=0。

此时 P 仍为 12。

第二天,1 号城市进行道路改善,改善后的图示如下:

此时每对顶点之间的灰尘度最小的路线对应的灰尘度为:

  • d(0,0)=0,d(0,1)=2,d(0,2)=2,

  • d(1,0)=2,d(1,1)=0,d(1,2)=0,

  • d(2,0)=2,d(2,1)=0,d(2,2)=0。

此时的 P 指标为(2+2)×2=8<Q,此时已经满足条件。

所以答案是 22。

【评测用例规模与约定】

  • 对于30% 的评测用例,1≤n≤10,0≤Li,jDi,j≤10;

  • 对于%60% 的评测用例,1≤n≤50,0≤Li,jDi,j≤10^5;

  • 对于所有评测用例,1≤n≤100,0≤Li,jDi,j≤105,0≤Q≤2^31−1。

蓝桥杯 2022 国赛 A 组 F 题。

#include<bits/stdc++.h>
using namespace std;
const int maxn=105;
const long long inf=1000000000000;
long long Q,P,n,L[maxn][maxn],D[maxn][maxn],d[maxn][maxn],l=0,r=1e9,ans=inf,mid;
bool check(long long t)
{
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
            d[i][j]=inf;
    }
    long long dd[maxn];    
    int tt=t/n,dt=t%n;
    for(int i=0;i<n;i++)
    {
        d[i][i]=0;
        dd[i]=tt+(i+1<=dt);
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            d[i][j]=max(D[i][j]-dd[i]-dd[j],L[i][j]);
        }
    }
    for(int i=0;i<n;i++)//floyd
    {
        for(int j=0;j<n;j++)
        {
            for(int k=0;k<n;k++)
            {
                d[j][k]=min(d[j][k],d[j][i]+d[i][k]);
            }
        }
    }
    P=0;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            P+=d[i][j];
        }
    }
    return (P<=Q);
}
int main()
{
    cin>>n>>Q;
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>D[i][j];
        }
    }
    for(int i=0;i<n;i++)
    {
        for(int j=0;j<n;j++)
        {
            cin>>L[i][j];
        }
    }
    while(l<=r)//二分
    {
        mid=(l+r)/2;
        if(check(mid))ans=min(ans,mid),r=mid-1;
        else l=mid+1;
    }
    if(ans==inf)cout<<-1;
    else cout<<ans;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值