2022/12/30总结

Lake Counting S

题目描述

由于近期的降雨,雨水汇集在农民约翰的田地不同的地方。我们用一个 N\times M(1\leq N\leq 100, 1\leq M\leq 100)N×M(1≤N≤100,1≤M≤100) 的网格图表示。每个网格中有水(W) 或是旱地(.)。一个网格与其周围的八个网格相连,而一组相连的网格视为一个水坑。约翰想弄清楚他的田地已经形成了多少水坑。给出约翰田地的示意图,确定当中有多少水坑。

输入第 11 行:两个空格隔开的整数:NN 和 MM。

第 22 行到第 N+1N+1 行:每行 MM 个字符,每个字符是 W 或 .,它们表示网格图中的一排。字符之间没有空格。

输出一行,表示水坑的数量。

题解:

1:寻找周围八个方格是否有水

2:然后我们把搜索到的用‘ . ’覆盖掉,这样被算进一个水坑的W就不会重复计算。

代码

#include<stdio.h>
int a,b,count=0;
char c[1000][1000];
void dfs(int x,int y)
{c[x][y]='.';
   int  s[8][2]={0,1,0,-1,1,0,-1,0,1,1,-1,-1,1,-1,-1,1};//八个方向
    for(int i=0;i<8;i++)
    {
            if(c[x+s[i][0]][y+s[i][1]]=='W'&&x+s[i][0]>=0&&x+s[i][0]<a&&y+s[i][1]>=0&&y+s[i][1]<b)//是否越界
            {
            dfs(x+s[i][0],y+s[i][1]);
            }
    }
}
int main()
{
    scanf("%d%d",&a,&b);
    for(int i=0;i<a;i++)
    {
            scanf("%s",c[i]);
    }
    for(int i=0;i<a;i++)
    {
        for(int j=0;j<b;j++)
        {
            if(c[i][j]=='W')//寻找周围的水
            {
                dfs(i,j);
                count++;
            }
        }
    }
    printf("%d",count);
}

二:小兔子的果园

题目描述

小兔子有n个果园,果园里有许多果树,有苹果树,芒果树,香蕉树,李子树,无花果树。
终于到了丰收的季节,小兔子从每个果园采了许多的水果,现在小兔子想给每个果园的产量排序。
因为小兔子爱吃芒果,所以按芒果的数量从大到小排序,如果芒果的数量相同,那就按照其他水果的总数量从小到大排序。
不会存在芒果数量相同且其他水果的总数量相同的情况。

输入

第一行输入一个n,代表n个果园(1<=n<=10)
接下来n行,每行五个数,分别代表小兔子从果园里采摘的苹果数量,芒果数量,香蕉数量,李子数量,无花果数量
每个水果的数量不超过10,且没有负数。

输出

输出n个果园产量排序后的结果

题解:

1:利用结构体把每种水果记录下

2:把芒果的数量进行比较

3:相同的话总和比较

代码

#include<stdio.h>
struct fun
{
    int a,b,c,d,e;
} ;
int main()
{struct fun s[10];
    struct fun t[10];
    int n;
    scanf("%d",&n);
    for(int i=0; i<n; i++)
    {
        scanf("%d %d %d %d %d",&s[i].a,&s[i].b,&s[i].c,&s[i].d,&s[i].e);//输入
    }
    for(int i=0; i<n-1; i++)
    {
        for(int j=0; j<n-i-1; j++)
        {
            if(s[j].b<s[j+1].b)  //芒果的数量比较
            {
                t[j]=s[j];
                s[j]=s[j+1];
                s[j+1]=t[j];
            }
            if(s[j].b==s[j+1].b)  //相同情况
            {
                if(s[j].a+s[j].c+s[j].d+s[j].e>s[j+1].a+s[j+1].c+s[j+1].d+s[j+1].e)
                {
                    t[j]=s[j];
                    s[j]=s[j+1];
                    s[j+1]=t[j];
                }
            }
        }
    }
    for(int i=0; i<n; i++)
    {
        printf("%d %d %d %d %d",s[i].a,s[i].b,s[i].c,s[i].d,s[i].e);
        printf("\n");
    }
}

知识点:

模板情况:

0-1背包:外循环nums,内循环target,target倒序,target>=nums[i]
完全背包:外循环nums,内循环target,target正序,target>=nums[i]
组合背包:外循环nums,内循环target,target正序,target>=nums[i]
分组背包:外循环背包数bags,内循环两层根据题目转换成以上三种背包类型

问题情况:
最值问题:dp[i] = max/min(dp[i],dp[i - nums[i]] + 1)或dp[i] = max/min(dp[i],dp[i - nums[i]] + nums[i]);
存在问题:dp[i] = dp[i] || dp[i-nums[i]]
组合问题:dp[i] += dp[i-nums[i]]
 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值