sduacm16级寒假训练 搜索与背包

https://vjudge.net/contest/148064
Password: acmlab2016

A - Oil Deposits
【题意】
找出图中‘@’相邻构成的连通块。水平,垂直或对角线相邻都算相邻。
【思路】
DFS.
【Code】

#include<cstdio>
int n,m,ans;
char a[101][101];
int d[101][101];
int dx[8]={0,1,1,1,0,-1,-1,-1};
int dy[8]={1,0,-1,1,-1,-1,1,0};
void dfs(int x,int y)
{
    for (int i=0;i<8;i++)
    {
        int xx=x+dx[i],yy=y+dy[i];
        if (xx<0||xx>=n||yy<0||yy>=m||a[xx][yy]=='*') continue;
        a[xx][yy]='*';
        dfs(xx,yy);
    }
}
int main()
{
    while(scanf("%d %d",&n,&m)&&n)
    {
        for (int i=0;i<n;i++)
            scanf("%s",a[i]);
        ans=0;
        for (int i=0;i<n;i++)
            for (int j=0;j<m;j++)
            if (a[i][j]=='@')
        {
            a[i][j]='*';
            ans++;
            dfs(i,j);
        }
        printf("%d\n",ans);
    }
    return 0;
}

B - Meteor Shower
【题意】
有M个流星要砸下来,流星i在时刻Ti (0 ≤ Ti ≤ 1,000) 砸到(Xi, Yi) (0 ≤ Xi ≤ 300; 0 ≤ Yi ≤ 300),以及与它相邻的四连块,有个人从(0, 0)出发,每时刻移动1个单位距离,问最少花费多少时间可以移动到安全位置(永远没有流星砸到的地方)
【思路】
预处理一下图,然后BFS。
【Code】

#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
using namespace std;
int n;
int d[306][306];
bool v[306][306];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
struct node{
    int x,y,step;
};
queue<node> q;
int bfs()
{
    memset(v,0,sizeof(v));
    q.push((node){0,0,0});
    v[0][0]=true;
    while(!q.empty())
    {
        node p=q.front();
        for (int i=0;i<4;i++)
        {
            int x=p.x+dx[i],y=p.y+dy[i],step=p.step+1;
            if (x<0||y<0||v[x][y]||d[x][y]<=step) continue;
            if (d[x][y]==5200000) return step;
            v[x][y]=true;
            q.push((node){x,y,step});
        }
        q.pop();
    }
    return -1;
}
int main()
{
    scanf("%d",&n);
    for(int i=0;i<306;i++)
        for (int j=0;j<306;j++)
            d[i][j]=5200000;
    for (int i=0;i<n;i++)
    {
        int x,y,tm;
        scanf("%d %d %d",&x,&y,&tm);
        d[x][y]=min(tm,d[x][y]);
        for (int j=0;j<4;j++)
        {
            int xx=x+dx[j],yy=y+dy[j];
            if (xx>=0&&yy>=0) d[xx][yy]=min(tm,d[xx][yy]);
        }
    }
    int ans=bfs();
    printf("%d\n",ans);
    return 0;
}

C - Red and Black
【题意】
输入W * H的字符矩阵,求从@出发四个方向运动能到达.的数量,#不可达
【思路】
DFS.
【Code】

#include<cstdio>
int n,m,ans;
char a[25][25];
int dx[4]={0,1,0,-1};
int dy[4]={1,0,-1,0};
void dfs(int x,int y)
{
    a[x][y]='#';
    ans++;
    for (int i=0;i<4;i++)
    {
        int cx=x+dx[i],cy=y+dy[i];
        if (cx<0||cy<0||cx>=n||cy>=m||a[cx][cy]=='#') continue;
        dfs(cx,cy);
    }
}
int main()
{
    while (scanf("%d %d",&m,&n)&&m)
    {
        for (int i=0;i<n;i++)
            scanf("%s",a[i]);
        ans=0;
        for (int i=0;i<n;i++)
            for(int j=0;j<m;j++)
            if (a[i][j]=='@') dfs(i,j);
        printf("%d\n",ans);
    }
}

D - Smallest Difference
【题意】
给你2至10个0~9之间的整数,每个数最多出现一次,组合拆成两个数,求这两个数差值的绝对值的最小值
【思路】
贪心+枚举.
差值最小肯定两个数的位数相等(偶数)或差1位(奇数).然后去枚举这个数列的全排列,找到最小差值.
用到了STL的next_permutation
next_permutation(a,a+n)即a数列前n个数的下一个排列.
类似的还有prev_permutation.
最后一个排列没有下一个排列,用next_permutation会返回false,但是使用了这个方法后,序列会变成字典序列的第一个,如cba变成abc。prev_permutation同理
【Code】

#include <cstdio>
#include <cstring>
#include <algorithm>
using namespace std;
int main()
{
    int T;
    scanf("%d",&T);
    getchar();
    while (T--)
    {
        int a[12];
        char s[25];
        fgets(s,25,stdin);
        int len=strlen(s),n=0;
        for (int i=0;i<len;i++)
            if (s[i]>='0'&&s[i]<='9')
                a[n++]=s[i]-'0';
        int ans=0x7FFFFFFF;
        do {
            if ((n>2)&&(a[0]==0||a[n/2]==0)) continue;
            int x=0,y=0;
            for (int i=0;i<n/2;i++) x=x*10+a[i];
            for (int i=n/2;i<n;i++) y=y*10+a[i];
            ans = min(ans,abs(x-y));
        } while (next_permutation(a,a+n));
        printf("%d\n", ans);
    }
}

E - Charm Bracelet
【题意】
大小为M的背包最多能装价值为多少的物品
【思路】
P01.
【Code】

#include<cstdio>
#include<algorithm>
int n,m,w[3500],v[3500],f[13500];
int main()
{
    scanf("%d %d",&n,&m);
    for (int i=1;i<=n;i++) scanf("%d %d",&w[i],&v[i]);
    f[0]=0;
    for (int i=1;i<=n;i++)
        for(int j=m;j>=w[i];j--)
        {
            f[j]=std::max(f[j],f[j-w[i]]+v[i]);
            //printf("f[%d,%d]=%d\n",i,j,f[j]);
        }
    printf("%d\n",f[m]);
}

F - Piggy-Bank
【题意】
给定一个储钱罐的容量M,给定N种硬币的价值和重量,问是否能填满储钱罐,能填满则输出储钱罐内钱的最小值
【思路】
P02.
【Code】

#include<cstdio>
#include<algorithm>
int w[505],v[505],f[10050];
const int INF=0x3FFFFFFF;
int main()
{
    int T;
    scanf("%d",&T);
    while(T--)
    {
        int n,m,e,t;
        scanf("%d %d",&e,&t);
        m=t-e;
        scanf("%d",&n);
        for (int i=1;i<=n;i++) scanf("%d %d",&v[i],&w[i]);
        for (int i=0;i<=m;i++) f[i]=INF;
        f[0]=0;
        for (int i=1;i<=n;i++)
            for(int j=w[i];j<=m;j++)
            {
                f[j]=std::min(f[j],f[j-w[i]]+v[i]);
                //printf("f[%d,%d]=%d\n",i,j,f[j]);
            }
        if (f[m]!=INF) printf("The minimum amount of money in the piggy-bank is %d.\n",f[m]);
        else printf("This is impossible.\n");
    }
}
在使用Python来安装geopandas包时,由于geopandas依赖于几个其他的Python库(如GDAL, Fiona, Pyproj, Shapely等),因此安装过程可能需要一些额外的步骤。以下是一个基本的安装指南,适用于大多数用户: 使用pip安装 确保Python和pip已安装: 首先,确保你的计算机上已安装了Python和pip。pip是Python的包管理工具,用于安装和管理Python包。 安装依赖库: 由于geopandas依赖于GDAL, Fiona, Pyproj, Shapely等库,你可能需要先安装这些库。通常,你可以通过pip直接安装这些库,但有时候可能需要从其他源下载预编译的二进制包(wheel文件),特别是GDAL和Fiona,因为它们可能包含一些系统的依赖。 bash pip install GDAL Fiona Pyproj Shapely 注意:在某些系统上,直接使用pip安装GDAL和Fiona可能会遇到问题,因为它们需要编译一些C/C++代码。如果遇到问题,你可以考虑使用conda(一个Python包、依赖和环境管理器)来安装这些库,或者从Unofficial Windows Binaries for Python Extension Packages这样的网站下载预编译的wheel文件。 安装geopandas: 在安装了所有依赖库之后,你可以使用pip来安装geopandas。 bash pip install geopandas 使用conda安装 如果你正在使用conda作为你的Python包管理器,那么安装geopandas和它的依赖可能会更简单一些。 创建一个新的conda环境(可选,但推荐): bash conda create -n geoenv python=3.x anaconda conda activate geoenv 其中3.x是你希望使用的Python版本。 安装geopandas: 使用conda-forge频道来安装geopandas,因为它提供了许多地理空间相关的包。 bash conda install -c conda-forge geopandas 这条命令会自动安装geopandas及其所有依赖。 注意事项 如果你在安装过程中遇到任何问题,比如编译错误或依赖问题,请检查你的Python版本和pip/conda的版本是否是最新的,或者尝试在不同的环境中安装。 某些库(如GDAL)可能需要额外的系统依赖,如地理空间库(如PROJ和GEOS)。这些依赖可能需要单独安装,具体取决于你的操作系统。 如果你在Windows上遇到问题,并且pip安装失败,尝试从Unofficial Windows Binaries for Python Extension Packages网站下载相应的wheel文件,并使用pip进行安装。 脚本示例 虽然你的问题主要是关于如何安装geopandas,但如果你想要一个Python脚本来重命名文件夹下的文件,在原始名字前面加上字符串"geopandas",以下是一个简单的示例: python import os # 指定文件夹路径 folder_path = 'path/to/your/folder' # 遍历文件夹中的文件 for filename in os.listdir(folder_path): # 构造原始文件路径 old_file_path = os.path.join(folder_path, filename) # 构造新文件名 new_filename = 'geopandas_' + filename # 构造新文件路径 new_file_path = os.path.join(folder_path, new_filename) # 重命名文件 os.rename(old_file_path, new_file_path) print(f'Renamed "{filename}" to "{new_filename}"') 请确保将'path/to/your/folder'替换为你想要重命名文件的实际文件夹路径。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值