数青蛙​、[USACO10FEB]Chocolate Giving S

这篇具有很好参考价值的文章主要介绍了数青蛙​、[USACO10FEB]Chocolate Giving S。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。

一、1419. 数青蛙

数青蛙​、[USACO10FEB]Chocolate Giving S

思路

这道题有俩种解法,一是记数,二是贪心

记数:

这是官方的题解

我们用frog_ num来表示现在正在发出蛙鸣声的青蛙数目,用cnt[c] 示已经发出-次有效蛙鸣中的字符c的青蛙个数,比如当cnt['c'] = 2时表示当前有2只青蛙已经发出了有效蛙鸣中的字符‘c’,下-个要发出学符r'。那么我们遍历字符串croakOfFrogs来模拟青蛙蛙鸣,现在记遍历到的字符为c,有:


1.若c='c',则需要-只青蛙开始发出蛙鸣,有fog_ num= fog_ num+ 1, cnt{'c']= cnt'c']+ 1。
2.则我们记prec为-次有效蛙鸣中该字符c的前一个字符
3.若当前cnt[prec]= 0,即没有青蛙可以发出字符c,直接返回-1。
4.否则cntprec] = cntprec]- 1, cnt[c]= cnt[c] +1。 哨c=k'时,说明一只青蛙完成了完
5.整的- -次蛙鸣,此时正在发出蛙鸣声的青蛙数目减- -,有: fog. num= fog_ num- 1。

若遍历完还有正在发出蛙鸣的青蛙,即fog_ num > 0,说明croakOfFrogs 不是被若干有效的蛙鸣混合而成,直接返回- 1。 否则我们只要返回在遍历的过程中正在发出蛙鸣的青蛙数目的最大值即可。
贪心:

这里有大佬的图片

数青蛙​、[USACO10FEB]Chocolate Giving S

 代码实现

记数:
 

int minNumberOfFrogs(char * croakOfFrogs){
    int len=strlen(croakOfFrogs);
    if(len%5!=0)return -1;
    int res=0,num=0;
    int cnt[4],map[26];
    memset(cnt,0,sizeof(cnt));
    map['c'-'a']=0;
    map['r'-'a']=1;
    map['o'-'a']=2;
    map['a'-'a']=3;
    map['k'-'a']=4;
    for(int i=0;i<len;i++)
    {
        char c=croakOfFrogs[i];
        int t=map[c-'a'];
        if(t==0)
        {
            cnt[t]++;
            num++;
            if(num>res)res=num;
        }
        else
        {
            if(cnt[t-1]==0)return -1;
            cnt[t-1]--;
            if(t==4)num--;
            else cnt[t]++;
        }
    }
    if(num>0)return -1;
    return res;
}

贪心

int minNumberOfFrogs(char * croakOfFrogs){
    int len=strlen(croakOfFrogs);
    int cnt[5]={0};
    for(int i=0;i<len;i++)
    {
        switch(croakOfFrogs[i])
        {
           case 'c':
                if(cnt[4])cnt[4]--;
                cnt[0]++;
                break;
            case 'r':
                if(cnt[0])
                {
                    cnt[0]--;
                    cnt[1]++;
                }
                else return -1;
                break;
            case 'o':
                if(cnt[1])
                {
                    cnt[1]--;
                    cnt[2]++;
                }
                else return -1;
                break;
            case 'a':
                if(cnt[2])
                {
                    cnt[2]--;
                    cnt[3]++;
                }
                else return -1;
                break;
            case 'k':
                if(cnt[3])
                {
                    cnt[3]--;
                    cnt[4]++;
                }
                else return -1;
                break;
        }
    }
    if(cnt[0]==0&&cnt[1]==0&&cnt[2]==0&&cnt[3]==0)return cnt[4];
    else return -1;
}

 二、[USACO10FEB]Chocolate Giving S

数青蛙​、[USACO10FEB]Chocolate Giving S

 数青蛙​、[USACO10FEB]Chocolate Giving S

 数青蛙​、[USACO10FEB]Chocolate Giving S

思路

这道题是一道最短路劲的问题,虽然当时做的时候读懂题意花了很久,但是细想的话就很简单,就它就是多了一道要从a去b的时候还要必须经过一个点1,这样可以分成俩段路径,一种是1到a点的最短路径,一种是1到b点的最短路径,这样做就很简单了

要注意一点的是,这题不能用邻接矩阵来做,要用链式前向星或者邻接表来做,否则会爆掉

代码实现文章来源地址https://www.toymoban.com/news/detail-436053.html

#include<stdio.h>
#include<string.h>
#define inf 100001
int dis[50001], book[50001], x[50001][50001];
int n, m, b, sum = 0;

int dijkstra(int from, int to)
{
    int i,pos;
    for (i = 1; i <= n; i++)  //初始化
    {
        book[i] = 0;
        dis[i] = x[from][i];
    }
    book[from]=1;
    for (i = 1; i < n; i++)
    {
        int min = inf;
        for (int j = 1; j <= n; j++)
        {
            if (book[j] == 0 && min > dis[j])
            {
                min = dis[j];
                pos = j;
            }
        }
        book[pos] = 1;
        for (int j = 1; j <= n; j++)
        {
            if (book[j] == 0 && dis[j] > dis[pos] + x[pos][j])
                dis[j] = dis[pos] + x[pos][j];
        }
    }
return dis[to];
}

int main()
{
    scanf("%d %d %d", &n, &m, &b);
    for (int i = 1; i <= n; i++)for (int j = 1; j <= n; j++)x[i][j] = inf;
    while (m--)
    {
        int r, s, t;
        scanf("%d %d %d", &r, &s, &t);
        x[r][s] = t;
        x[s][r] = t;
    }
    while (b--)
    {
        int r, s;
        scanf("%d %d", &r, &s);
        if(s==1)sum=dijkstra(r,s);
        else sum = dijkstra(r, 1) + dijkstra(1,s);
        printf("%d\n", sum);
    }
    return 0;
}

到了这里,关于数青蛙​、[USACO10FEB]Chocolate Giving S的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • 10种常用的数据分析思路

    道家曾强调四个字,叫“道、法、术、器”。 层次分别为: “器”是指物品或工具,在数据分析领域指的就是数据分析的产品或工具,“工欲善其事,必先利其器”; “术”是指操作技术,是技能的高低、效率的高下,如对分析工具使用的技术; “法”是指选择的方法,有

    2024年02月08日
    浏览(42)
  • API安全Top 10 漏洞:crAPI漏洞靶场与解题思路

    靶场简介 在 hack 中学习,不要去学习 hack 。 对于想了解 API 安全的同学,最直接的方式就是拿到一个靶场进行实战。正好,crAPI 项目就是 OWASP 推出的 API 安全项目,可以帮助大家了解常见的 API 安全漏洞。 本文将对 crAPI 靶场的相关漏洞以及打靶思路进行简单的介绍,希望对

    2024年01月20日
    浏览(41)
  • 动态规划--青蛙跳台阶

    斐波那契数列每次学都有不一样的体会,从最开始简单理解就是,一个找规律的游戏,就是更新数值,往后算就行了,但是,后来,用斐波那契数列理解递归算法,是一个很好的例子,由上向下计算,依次回溯,最后,没想到斐波那契数列还能和动态规划联系起来。当然,斐

    2024年02月19日
    浏览(31)
  • 青蛙跳台阶问题

    题目:青蛙上楼需要走n个台阶,一次可以跳1个或2个台阶,那它一共有多少中走法 本题运用的递归的写法,由分析可知,青蛙一次只能走1或2个台阶,且有且仅有1中走法,n=2时,有两种走法,假设n=10,则走法共有在当前基础上进行的n-1+n-2种走法相加

    2024年02月12日
    浏览(42)
  • 青蛙兔子的约会

    每当晚上时,青蛙都会出来活动,白天休息。白天时,兔子就会出来活动,晚上休息。 青蛙一次可以跳 a a a 米,兔子一次可以跳 b b b 米,已知青蛙在坐标 0 0 0 的位置,兔子在坐标 n n n 的位置。 现在青蛙与兔子在明天白天有个约会,但是青蛙不想等太久兔子,他决定在今天

    2024年02月04日
    浏览(45)
  • 【青蛙跳台阶问题 —— (三种算法)】

    一只青蛙一次可以跳上1级台阶,也可以跳上2级台阶。求该青蛙跳上一个 n 级的台阶总共有多少种跳法。 答案需要取模 1e9+7(1000000007),如计算初始结果为:1000000008,请返回 1。 示例 1: 输入:n = 2 输出:2 示例 2: 输入:n = 7 输出:21 示例 3: 输入:n = 0 输出:1 提示:

    2024年02月05日
    浏览(39)
  • C语言 青蛙跳台阶问题

    目录 ​编辑 1.问题描述 2.问题分析 3.全部代码 4.结语 一只青蛙可以一次跳一级台阶,也可以一次跳两级台阶,如果青蛙要跳上n级台阶有多少种跳法? 当台阶只有一级时,只能跳一级,所以只有一种跳法 当台阶有两级时,可以先跳一级,再跳一级,或者直接跳两级 所以有两

    2024年03月28日
    浏览(38)
  • XTU-OJ 1343-青蛙

    有n个位置按顺时钟排列成一个圆,分别编号从1∼n。一只青蛙最开始在1号位置上,它每次可以跳往与之相隔k个位置的位置上。比如,n=5,k=2时, 青蛙从位置1可以按逆时钟方向跳到位置3,也可以按顺时钟方向跳到位置4。请问这只青蛙能跳到所有的位置上吗? 第一行输入一个

    2024年02月07日
    浏览(37)
  • 【动态规划】C++算法:403.青蛙过河

    视频算法专题 动态规划汇总 一只青蛙想要过河。 假定河流被等分为若干个单元格,并且在每一个单元格内都有可能放有一块石子(也有可能没有)。 青蛙可以跳上石子,但是不可以跳入水中。 给你石子的位置列表 stones(用单元格序号 升序 表示), 请判定青蛙能否成功过

    2024年01月17日
    浏览(47)
  • WIN10 弹窗提示“无法登录到你的账户” 问题解决思路

    WIN10系统登陆后,桌面上弹窗提示“无法登录到你的账户”,“我的电脑”图标消失,系统快捷键大部分失效,打不开系统设置,只有回收站能打开,重启多次+注销多次无效。 1.右键桌面左下角开始图标,打开Windows PowerShell(管理员) 2.输入net user,回车,查看系统存在的所有本

    2024年02月04日
    浏览(60)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包