周报:巩固题目

巩固作业

P1796 汤姆斯的天堂梦

题目描述

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

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

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

输入格式

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

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

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

输出格式

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

#include <algorithm>
#include<bits/stdc++.h>
using namespace std;
int n,m,tem,flag,ans=999999,dp[105][105],N[105];
int main()
{
    cin>>n;
    
    for(int i=1;i<=n;i++)//通往第i个星球
    {
        cin>>N[i];//第i层的节点个数
        for(int j=1;j<=N[i];j++)//枚举这一层所有的星球
        {
            dp[i][j]=99999;
            while(1)
            {
                cin>>flag;
                if(flag==0)break;
                cin>>tem;
                dp[i][j]=min(dp[i-1][flag]+tem,dp[i][j]);
                if(i==n)ans=min(dp[i][j],ans);
            }
        }
    }
    cout<<ans;
}

P1806 跑步

题目描述

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

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

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

输入格式

一行一个整数,代表 �n

输出格式

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

#include<bits/stdc++.h>
using namespace std;
long long n,ans,dp[600];
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];
        }
    }
    ans=dp[n]-1;//减去一次性跑完n圈的情况
    cout<<ans;
}

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

题目描述

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

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

输入格式

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

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

输出格式

输出一个整数代表答案。

#include<bits/stdc++.h>
using namespace std;
int sum,dp[100005],f[105],n,ans;
int main()
{
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>f[i];
        sum+=f[i];//确定背包容量
    }
    dp[0]=1;//称出重量0只有不放,故可以称出重量0
    for(int i=1;i<=n;i++)
    {
        for(int j=sum;j>=f[i];j--)
        {
            if(dp[j-f[i]]==1/*能称出j-f[i]的重量*/)dp[j]=1;
        }
    }
    for(int i=1;i<=n;i++)
    {
        for(int j=1;j<=sum-f[i];j++)
        {
            if(dp[j+f[i]]==1/*能称出j+f[i]的重量*/)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。

输入格式

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

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

输出格式

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

#include<bits/stdc++.h>
using namespace std ;
int n , ans ;
int x[3005],y[3005] ;
bool m[5005][5005] ;
bool pd(int x ,int y) //判断点是否存在,是否越界
{
    if(x < 0 || x > 5000)return 0 ;
    if(y < 0 || y > 5000)return 0 ;
    if(m[x][y]==0)return 0 ;
    return 1 ;
}
int check(int x1 ,int y1 ,int x2 ,int y2)
{
    int dy=y1-y2;
    int dx=x1-x2;
    if( pd(x1+dy , y1-dx ))
        if( pd(x2+dy, y2- dx ))
            return dx*dx+dy*dy ;
    if( pd(x1-dy ,y1+dx ))
        if( pd(x2-dy ,y2+dx ))
            return dx*dx +dy*dy ;
    return 0;
}
int main()
{
    cin>>n;
    for(int i = 1;i <= n; i ++)
    {
        cin>>x[i]>>y[i];
        m[x[i]][y[i]]=1;
    }
    for(int i = 1 ; i <= n ; i ++)
        for(int j = 1; j < i ; j ++ )
            ans = max( ans , check(x[i] , y[i] , x[j] , y[j] ) );
    cout<<ans;
}
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值