AcWing - 寒假每日一题2023(DAY 1——DAY 5)

news2024/11/20 9:28:08

文章目录

  • 一、AcWing 4261.孤独的照片(简单)
    • 1. 实现思路
    • 2. 实现代码
  • 二、AcWing 3400.统计次数(简单)
    • 1. 实现思路
    • 2. 实现代码
  • 三、AcWing 4366. 上课睡觉(简单)
    • 1. 实现思路
    • 2. 实现代码
  • 四、AcWing 3443. 学分绩点(简单)
    • 1. 实现思路
    • 2. 实现代码
  • 五、AcWing 4818. 奶牛大学(简单)
    • 1. 实现思路
    • 2. 实现代码

一、AcWing 4261.孤独的照片(简单)

题目描述

Farmer John 最近购入了 N 头新的奶牛,每头奶牛的品种是更赛牛(Guernsey)或荷斯坦牛(Holstein)之一。
奶牛目前排成一排,Farmer John 想要为每个连续不少于三头奶牛的序列拍摄一张照片。
然而,他不想拍摄这样的照片,其中只有一头牛的品种是更赛牛,或者只有一头牛的品种是荷斯坦牛——他认为这头奇特的牛会感到孤立和不自然。
在为每个连续不少于三头奶牛的序列拍摄了一张照片后,他把所有「孤独的」照片,即其中只有一头更赛牛或荷斯坦奶牛的照片,都扔掉了。
给定奶牛的排列方式,请帮助 Farmer John 求出他会扔掉多少张孤独的照片。
如果两张照片以不同位置的奶牛开始或结束,则认为它们是不同的。

输入格式

输入的第一行包含 N。
输入的第二行包含一个长为 N 的字符串。如果队伍中的第 i 头奶牛是更赛牛,则字符串的第 i 个字符为 G。否则,第 i 头奶牛是荷斯坦牛,该字符为 H

输出格式

输出 Farmer John 会扔掉的孤独的照片数量。

数据范围

3 ≤ N ≤ 5×1e5

输入样例

5
GHGHG

输出样例

3

样例解释

这个例子中的每一个长为 3 的子串均恰好包含一头更赛牛或荷斯坦牛——所以这些子串表示孤独的照片,并会被 Farmer John 扔掉。
所有更长的子串(GHGHHGHGGHGHG)都可以被接受。

具体实现

1. 实现思路

  • 由于数据范围是 50 万,因此,我们需要使用 long long,数据范围要控制在 O(nlogn) 或者 O(n)。
  • 要枚举的字符串当中,某个字母只能出现一次。因此,我们可以枚举只出现一次的字母是哪个,这里以字母 G 为例,枚举包含字母 G 且只包含一个 G 且字符串长度大于等于 3。
  • 为了方便,我们可以统计出 G 左边和右边各有多少个 H,这里假设 G 左边有 L 个 H,右边有 R 个 H,便有如下几种情况。
  • (1) 左右两边至少各包含一个 H ,则需要丢弃的照片数为 L*R。
  • (2) 左边没有 H,右边至少包含两个 H,则需求丢弃的照片数为 R-1。
  • (3) 右边没有 H,左边至少包含两个 H,则需求丢弃的照片数为 L-1。
  • 将如上三种情况相加,便可以得到总共需要丢弃的照片数。

2. 实现代码

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N = 500010;

int n;
char str[N];
//L[N]表示左边有多少个跟当前位置不同的字母
//R[N]表示右边有多少个跟当前位置不同的字母
int L[N], R[N];

int main()
{
    cin >> n;
    cin >> str;
    
    //左边
    for (int i = 0, h = 0, g = 0; i < n; i ++ )
    {
    	if (str[i] == 'G')
		{
			L[i] = h;
			h = 0;
			g ++;
		}
        else
		{
			L[i] = g;
			g = 0;
			h ++;
		}
	}
	
    //右边
    for (int i = n - 1, h = 0, g = 0; i >= 0; i -- )
    {
    	if (str[i] == 'G')
		{
			R[i] = h;
			h = 0;
			g ++;
		}
        else
		{
			R[i] = g;
			g = 0;
			h ++;
		}
	}        

    LL res = 0;
    
    for (int i = 0; i < n; i ++ )
    {
    	res += (LL)L[i] * R[i] + max(L[i] - 1, 0) + max(R[i] - 1, 0);
	}        

    cout << res;
    system("pause");
    return 0;
}

二、AcWing 3400.统计次数(简单)

题目描述

给定两个正整数 n 和 k,求从 1 到 n 这 n 个正整数的十进制表示中 k 出现的次数。

输入格式

共一行,包含两个整数 n 和 k。

输出格式

输出一个整数,表示答案。

数据范围

1 ≤ n ≤ 1e6
1 ≤ k ≤ 9

输入样例

12 1

输出样例

5

样例解释

从 1 到 12 这些整数中包含 1 的数字有 1,10,11,12,一共出现了 5 次 1。

具体实现

1. 实现思路

  • 该题的数据范围比较小,因此,我们可以使用暴力枚举进行解决。
  • 我们可以从 1 遍历到 n,分别统计每个数中 k 出现的次数。
  • 怎么统计一个数 x 中 k 出现的次数呢?我们可以不断取 x 的末尾,判断它是否为 k,再把 x 除以 10(舍弃末位)。
  • 这样一直把函数结果累加到答案上,最后输出答案即可。

2. 实现代码

#include <bits/stdc++.h>
using namespace std;

int main()
{
    int n, k;
    cin >> n >> k;

    int res = 0;
    for (int i = 1; i <= n; i ++ )
    {
        for (int j = i; j; j /= 10)
        {
            if (j % 10 == k)
            {
                res ++ ;
            }
        }
    }
    
    cout << res << endl;
    system("pause");
    return 0;
}

三、AcWing 4366. 上课睡觉(简单)

题目描述

有 N 堆石子,每堆的石子数量分别为 a1,a2,…,aN
你可以对石子堆进行合并操作,将两个相邻的石子堆合并为一个石子堆,例如,如果 a=[1,2,3,4,5],合并第 2,3 堆石子,则石子堆集合变为 a=[1,5,4,5]。
我们希望通过尽可能少的操作,使得石子堆集合中的每堆石子的数量都相同。
请你输出所需的最少操作次数。
本题一定有解,因为可以将所有石子堆合并为一堆。

输入格式

第一行包含整数 T,表示共有 T 组测试数据。
每组数据第一行包含整数 N。
第二行包含 N 个整数 a1,a2,…,aN

输出格式

每组数据输出一行结果。

数据范围

1 ≤ T ≤ 10
1 ≤ N ≤ 1e5
0 ≤ ai ≤ 1e6
从 i=1 到 i=n 的 ai 之和 ≤ 1e6
每个输入所有 N 之和不超过 1e5

输入样例

3
6
1 2 3 1 1 1
3
2 2 3
5
0 0 0 0 0

输出样例

3
2
0

样例解释

第一组数据,只需要用 3 个操作来完成:

1 2 3 1 1 1
-> 3 3 1 1 1
-> 3 3 2 1
-> 3 3 3

第二组数据,只需要用 2 个操作来完成:

2 2 3
-> 2 5
-> 7

第三组数据,我们什么都不需要做。

具体实现

1. 实现思路

  • 假设每堆石子有 cnt 个,一共有 sum 个石子。
  • 如果我们想让每堆石子的数量相同,那么,sum 除以 cnt 一定是可以整除的。然后,我们在所有可以取到的 cnt 里面,找一个操作数量最少的即可。
  • 假设我们初始有 n 堆石子,最后,每一堆有 cnt 个石子,那么会有 sum / cnt 堆石子,每操作一次会减少一堆,因此,我们一共有 n - sum / cnt 次操作。
  • 我们需要操作次数越少越好,但是,最初有多少堆石子和总共有多少个石子是定好的。所以,我们只能让每堆石子的数量 cnt 越小越好。然后,分别判断这个 cnt 是否成立即可。
  • 关于判断 cnt 是否成立,也就是我们判断最后能否将每堆的数量变成 cnt,由于只能合并相邻两堆。所以,问题就转变为,能否将整个序列分成若干段,使得每一段中的石子总数是 cnt。
  • 对此,我们从前向后考虑,逐步枚举。当我们第一段的石子数量小于 cnt 时,就说明还需要加入新的一堆石子,直到第一段的石子数量变成大于等于 cnt 为止。
  • 第一种情况:当我们的第一段石子数量大于 cnt 时,说明无解。因为,不加入下一堆石子数量小于 cnt,加入下一堆石子数量大于 cnt,说明第一段石子的数量是无法等于 cnt 的。
  • 第二种情况:当我们的第一段石子数量等于 cnt 时,如果下一堆石子数量是 0 的话,那是否加入则无所谓;如果下一堆石子数量不是 0 的话,则千万不能加入。

2. 实现代码

#include <bits/stdc++.h>

using namespace std;

const int N = 100010;

int n;
//w[N]表示每堆石子的数量
int w[N];

bool check(int cnt)
{
    //s表示这一段石子的数量
    for (int i = 0, s = 0; i < n; i ++ )
    {
        s += w[i];

        //如果s大于cnt,就直接返回false,开始枚举下一个
        //如果s等于cnt,就将其置为0,最后返回true,表明可以实现。
        if (s > cnt) 
		{
			return false;
		}
        if (s == cnt)
		{
			s = 0;
		}
    }
    return true;
}

int main()
{
    int T;
    cin >> T;
    
    while (T -- )
    {
        cin >> n;
        int sum = 0;
        
        for (int i = 0; i < n; i ++ )
        {
            cin >> w[i];
            sum += w[i];
        }

        for (int i = n; i; i -- )
		{
			if (sum % i == 0 && check(sum / i))
            {
                cout << n - i << endl;
                break;
            }
		}            
    }
    
    system("pause");
    return 0;
}

四、AcWing 3443. 学分绩点(简单)

题目描述

北京大学对本科生的成绩施行平均学分绩点制(GPA)。
既将学生的实际考分根据不同的学科的不同学分按一定的公式进行计算。
公式如下:

实际成绩绩点
90——1004.0
85——893.7
82——843.3
78——813.0
75——772.7
72——742.3
68——712.0
64——671.5
60——631.0
60以下0

一门课程的学分绩点 = 该课绩点 × 该课学分
总评绩点 = 所有学科学分绩点之和 / 所有课程学分之和
现要求你编写程序求出某人 A 的总评绩点(GPA)。

输入格式

第一行,总的课程数 n;
第二行,相应课程的学分(两个学分间用空格隔开);
第三行,对应课程的实际得分;
此处输入的所有数字均为整数。

输出格式

输出有一行,总评绩点,精确到小数点后 2 位小数。

数据范围

1 ≤ n ≤ 10
学分取值范围 [1,10]
课程得分范围 [0,100]

输入样例

5
4 3 4 2 3
91 88 72 69 56

输出样例

2.52

具体实现

1. 实现思路

  • 该题可以通过暴力方法直接完成,通过 if 判断语句,得出课程的实际得分所对应的绩点,再将其与该课程的学分相乘得到学分绩点,最后累加,再除以总学分之和即可,这要注意要保留两位小数。
  • 在 C++ 代码当中,保留小数需要使用头文件 #include <iomanip>,输出语句使用如下前缀 cout << fixed << setprecision(2) ,括号中表示保留小数的位数。
  • 在本题中,为了简便,我们使用两个数组,分别用来存成绩的区间下界和该区间对应的学分,便于我们后面的直接判断。

2. 实现代码

#include <bits/stdc++.h>

using namespace std;

const int N = 20;

int key[10] = {0, 60, 64, 68, 72, 75, 78, 82, 85, 90};
double value[10] = {0, 1.0, 1.5, 2.0, 2.3, 2.7, 3.0, 3.3, 3.7, 4.0};

//a[N]表示相应课程的学分
//b[N]对应课程的实际得分 
int a[N], b[N];

double get(int x)
{
    for (int i = 9; i >= 0; i -- )
    {
    	if (x >= key[i])
        {
        	return value[i];
		}
	}            
    return 0;
}

int main()
{
    int n;
    cin >> n;

    for (int i = 0; i < n; i ++ )
	{
		cin >> a[i];
	}
	
    for (int i = 0; i < n; i ++ )
	{
		cin >> b[i];
	}

    double sum = 0, cnt = 0;
    
    for (int i = 0; i < n; i ++ )
    {
        sum += get(b[i]) * a[i];
        cnt += a[i];
    }

    cout << fixed << setprecision(2) << sum / cnt;
    system("pause");
    return 0;
}

五、AcWing 4818. 奶牛大学(简单)

题目描述

Farmer John 计划为奶牛们新开办一所大学!
有 N 头奶牛可能会入学。
每头奶牛最多愿意支付 ci 的学费。
Farmer John 可以设定所有奶牛入学需要支付的学费。
如果这笔学费大于一头奶牛愿意支付的最高金额,那么这头奶牛就不会入学。
Farmer John 想赚尽可能多的钱,从而可以给他的讲师提供一笔可观的工资。
请求出他能赚到的钱的数量,以及此时应当收取多少学费。

输入格式

输入的第一行包含 N。
第二行包含 N 个整数 c1,c2,…,cN,其中 ci 是奶牛 i 愿意支付的最高学费金额。

输出格式

输出 Farmer John 可以赚到的最大金额以及最优情况下他应该收取的学费。如果有多个解,输出收取学费最小的解。
注意这个问题涉及到的整数可能需要使用 64 位整数型(例如,Java 中的 “long”,C/C++ 中的 “long long”)。

数据范围

1 ≤ N ≤ 1e5
1 ≤ ci ≤ 1e6

输入样例

4
1 6 4 6

输出样例

12 4

样例解释

如果 Farmer John 收费 4,那么 3 头奶牛将会入学,从而使他赚取 3×4=12 的金额。

具体实现

1. 实现思路

  • 由于我们设定的学费不同,愿意交学费的奶牛数量也不同,要综合比较选取赚到的最大金额以及最优情况下应该收取的学费。如果有多个解,输出收取学费最小的解。
  • 为了方便,我们可以先将愿意支付学费的奶牛从小到大排序。
  • 那么,取在一个区间里的学费数量与取在该区间右端点,收取的总体金额是相同的。
  • 因此,我们枚举每一个点,该点所收取的总体金额就是该点表示的学费乘以右边点的个数。
  • 最后,在其中选取一个总体金额最大的值,如果有总体金额相同的,则选取学费小的(也就是靠左边的点)。

在这里插入图片描述

2. 实现代码

#include <bits/stdc++.h>
using namespace std;

typedef long long LL;

const int N = 100010;

int n;
int w[N];

int main()
{
    cin >> n;
    for (int i = 0; i < n; i ++ )
	{
		cin >> w[i];
	}
    
    //将所有牛愿意交的学费按从小到大排序
    sort(w, w + n);

    //将总金额和入学费用初始化为0
    LL rtot = 0, rfee = 0;
    for (int i = 0; i < n; i ++ )
    {
        //该点的总金额
        LL tot = (LL)w[i] * (n - i);

        //如果有两个总金额相同的,我们要输出收学费少的。
        //因此,可以直接略去。
        //因为,学费是按从小到大排列,在左边的学费自然比在右边的学费少。
        if (tot > rtot)
        {
            rtot = tot;
            rfee = w[i];
        }
    }

    cout << rtot << " " << rfee << endl;
	system("pause"); 
	return 0;
}

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/159362.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

程序员接私活最最完整攻略

接私活对于程序员这个圈子来说是一个既公开又隐私的话题&#xff0c;当你竭尽全力想要去接私活的时候一定做过这样的事情&#xff0c;百度搜索“程序员如何接私活”、“程序员在哪里接外包”等等问题&#xff0c;今天就送大家最完整攻略&#xff0c;千万别错过了。 做私活挣钱吗…

有趣且重要的Git知识合集(10)git stash操作

这种一般用于多分支&#xff0c;或者多人协同合作时会使用到的git命令 场景1&#xff1a; 当你在dev分支上写了很多代码&#xff0c;此时线上有bug&#xff0c;需要紧急在hotfix分支上修改&#xff0c;那直接git add提交又不太好&#xff0c;毕竟还没有开发完&#xff0c;那么…

JVM 学习笔记 内存结构

内存结构 程序计数器 作用&#xff1a;记录下一条JVM指令的执行地址 特点&#xff1a; 线程私有不存在内存溢出 虚拟机栈 每个线程运行时所需的内存称为虚拟机栈。每个栈由多个栈帧&#xff08;Frame&#xff09;组成&#xff0c;每个栈帧对应每次方法调用时占用的内存。每…

BIOS 的详细介绍

一、BIOS详解 对于不少新手&#xff0c;刷新BIOS还是比较神秘的。而对于一些BIOS相关的知识&#xff0c;不少人也是一知半解。在这里&#xff0c;我们将对BIOS作一次全面的了解。 1、什么是BIOS BIOS是英文"Basic Input Output System"的缩略语&#xff0c;直译…

NTN(三) Timing

微信同步更新欢迎关注同名modem协议笔记。这篇看下k_offset和k_mac&#xff0c;如38.300所述&#xff0c;k_offset是配置的调度偏移量&#xff0c;需要大于或等于service link RTT和Common TA之和&#xff1b;k_mac 是配置的偏移量&#xff0c;需要大于或等于 RP 和 gNB 之间的…

Chem. Eur. J.|针对细胞内靶点的环肽药物:肽药物发展的下一个前沿

​题目&#xff1a;Cyclic Peptides as Drugs for Intracellular Targets: The Next Frontier in Peptide Therapeutic Development 文献来源&#xff1a;Chem. Eur. J. 2021, 27, 1487 – 1513 代码&#xff1a;无&#xff08;环肽综述&#xff09; 内容&#xff1a; 1.简…

5-迷宫问题(华为机试)

题目 定义一个二维数组 N*M&#xff0c;如 5 5 数组如下所示&#xff1a; int maze[5][5] { 0, 1, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 0, 0, 0, 1, 1, 1, 0, 0, 0, 0, 1, 0, }; 它表示一个迷宫&#xff0c;其中的1表示墙壁&#xff0c;0表示可以走的路&#xff0c;只…

通用模型切片处理过程 CesiumLab系列教程

我们前面把每种格式的模型参数设置已经讲解清楚&#xff0c;下面我们应该弄清楚通用模型切片剩下的流程&#xff0c;不管是人工模型&#xff0c;还是shp矢量面、bim模型&#xff0c;剩下的处理过程都是一样的&#xff0c;这里我们一起讲述。 资源库 ​通用模型处理分为两个过程…

基于JAVA的个人信息管理系统源码,含基于VUE的PC前端及移动端,用于管理个人消费、锻炼、音乐、阅读、健康、饮食等衣食住行信息

项目介绍 完整代码下载地址&#xff1a;基于JAVA的个人信息管理系统源码 用于管理个人消费、锻炼、音乐、阅读、健康、饮食、人生经历等各个衣食住行信息的系统&#xff0c;通过提醒、计划模块利用调度系统来统计分析执行情况。 并通过积分和评分体系来综合评估个人的总体状态…

【C++】类和对象【中篇】--C++六个默认成员函数以及const成员函数

文章目录一、类的6个默认成员函数二、构造函数1.概念2.特性2.1特征分析——自动生成2.2.特征分析——选择处理2.3特征分析——默认构造3.C11补丁——缺省值三、析构函数1.概念2.特征四、拷贝构造函数1.概念2.特征2.1引用分析——引用做参数2.2特征分析——深浅拷贝五、运算符重…

Clin Nutr | 浙大儿童医院-陈洁/倪艳揭示全肠内营养对儿童克罗恩病肠道菌群和胆汁酸代谢的影响...

全肠内营养对儿童克罗恩病肠道微生物群和胆汁酸代谢的影响The impact of exclusive enteral nutrition on the gut microbiome and bile acid metabolism in pediatric Crohns diseaseResearch article&#xff0c;2022年11月30日&#xff0c;Clinical Nutrition&#xff0c;7.…

Weblogic 任意文件上传漏洞(CVE-2018-2894)复现

目录 weblogic 漏洞环境准备 漏洞复现 修复建议 weblogic WebLogic是美国Oracle公司出品的一个application server&#xff0c;确切的说是一个基于JAVAEE架构的中间件&#xff0c;WebLogic是用于开发、集成、部署和管理大型分布式Web应用、网络应用和数据库应用的Java应…

Healthcare靶机总结

Healthcare靶机渗透总结 靶机下载地址: https://download.vulnhub.com/healthcare/Healthcare.ova 打开靶机,使用nmap扫描出靶机的ip和所有开放的端口 可以看到,靶机开放了21端口和80端口 21端口为ftp的端口,一般遇到这种,就可以考虑ftp的匿名登录,我们可以试一下 用户名anony…

【总结】华为、H3C、锐捷三家交换机配置命令详解

一直以来&#xff0c;对于华为、H3C、锐捷交换机的命令配置&#xff0c;不断的有朋友留言&#xff0c;三家交换机的配置命令容易弄混&#xff0c;经常在实际项目配置中出错&#xff0c;因此&#xff0c;本期我们将来介绍这三家交换机的基础配置命令&#xff0c;大家可以分别来看…

动手学区块链学习笔记(一):加密算法介绍

引言 本文根据实验楼以及自己查询到的一些资料&#xff08;文末给出&#xff09;&#xff0c;模拟了一下区块链从诞生到交易的整个过程&#xff0c;也算是弥补了一下之前区块链的一些缺失知识。 哈希加密原理介绍 什么是比特币&#xff1f; 比特币是一种加密货币&#xff0c…

【Python百日进阶-数据分析】Day223 - plotly瀑布图go.Waterfall()

文章目录一、语法二、参数三、返回值四、实例4.1 简单瀑布图4.2 多类别瀑布图4.3 设置标记大小和颜色4.4 水平瀑布图4.5 Dash中的应用一、语法 绘制瀑布轨迹&#xff0c;这是一种有用的图表&#xff0c;可以在条形图中显示各种元素&#xff08;正或负&#xff09;的贡献。y如果…

一文读懂mybatis连接池原理

本文需要配合代码demo一起观看更佳&#xff0c;源码地址。 本源码中对 mybatis代码做了详尽的注释。对mybatis源码进行了详尽的注释&#xff0c;且可以对项目进行install&#xff0c;然后在ron-man-mybatis1项目中 src/main/java/iron/man/lyf/ironmanmybatis1/run_test/Mybat…

亚马逊云科技启示录:创新作帆,云计算的征途是汪洋大海

开篇&#xff1a;创新是亚马逊云科技发展的最持久驱动力云计算&#xff0c;新世纪以来最伟大的技术进步之一&#xff0c;从2006年 Amazon Web Service 初创时的小试牛刀&#xff0c;到如今成长为一个巨大的行业和生态&#xff0c;已经走过16年的风雨历程。Java之父詹姆斯高斯林…

关于子查询

1、什么是子查询&#xff1a; select语句中嵌套select语句&#xff0c;被嵌套的select语句称为子查询。 2、子查询都可以出现在什么地方&#xff1a; select ..(select) #子查询可以出在select后面 from ..(select) #子查询可以出在from后面 where ..(select) …

操作系统考研复习(详细指导)--持续更新中

第一章操作系统的概念(定义)功能和目标操作系统的概念(定义)--什么是操作系统操作系统是指控制和管理整个计算机系统的硬件和软件资源(操作系统是系统资源的管理者)&#xff0c;并合理地组织调度计算机的工作和资源的分配&#xff1b;以提供给用户和其他软件方便的接口和环境 &…