ECNU第十届程序设计竞赛

2023-12-28 01:08

本文主要是介绍ECNU第十届程序设计竞赛,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

A. 浮点数模运算

Time limit per test: 1.0 seconds

Memory limit: 512 megabytes

几乎每个学 C 语言的人都会面临这样一种困惑:为什么 % 只支持整数和整数,不支持浮点数。自然,C++ 提供了运算符重载几乎可以很方便地实现自定义的浮点数模运算,但到底是不方便的。

而与此相对比的,Java / Python 等高级语言就直接支持了浮点数模运算。

本题就是:给两个浮点数 ab,求 amodb

然后你会发现,事情并不简单。

Input

一行两个浮点数 ab (0<a,b109),ab 保证保留到小数点后第九位

Output

输出浮点数,相对误差或绝对误差不超过 1015

假设你的答案是 a,标准答案是 b,你的答案正确当且仅当 |ab|max(1,|b|)<1015

Examples

input
3.000000000 2.000000000
output
1.000000000
input
0.400000000 0.200000000
output
0

看似简单的题,好像就只需要浮点数取个整数倍减一下就好了。

但是由于浮点数的精度不准,存在很大的精度问题。

比赛时候wa了快20遍。(毕竟没做过这类题目)

正解是把浮点数转成整数计算,这样精度就不会损失了。

当然不可能是int,位数不够。所以需要用long long。

先用string读入,再把小数点后位数少的那个数后面的小数点用零补齐。

再存下共有几位小数,计算完毕后再把小数点补上去就可以了。

代码写的比较ugly。懒得

#include <bits/stdc++.h>
#define ll long long
using namespace std;
int n;
int main()
{string s1,s2;cin>>s1>>s2;ll a = 0, b =0;int loc1 = 0, loc2 = 0,len;for(int i = 0; i < s1.length(); i++)if(s1[i] == '.' ){loc1 = i;break;}for(int i = 0; i < s2.length(); i++)if(s2[i] == '.'){loc2 = i;break;}if(s1.length() - loc1 > s2.length() - loc2){int temp = s1.length() - loc1 - (s2.length() - loc2);for(int i = 0; i < temp; i++)s2 = s2 + "0";len = s1.length() - loc1 - 1;}else{int temp = s1.length() - loc1 - (s2.length() - loc2);temp = -temp;for(int i = 0; i < temp; i++)s1 = s1 + "0";len = s2.length() - loc2 - 1;}for(int i = 0; i < s1.length(); i++)if(isdigit(s1[i]))a = a * 10 + s1[i] - '0';for(int i = 0; i < s2.length(); i++)if(isdigit(s2[i]))b = b * 10 + s2[i] - '0';ll ans = a % b;char line[200];sprintf(line, "%lld",ans);int length = strlen(line);string l = string(line);if(length < len){l = "0";for(int i = 0; i < len - length; i++)l = l + "0";l = l + string(line);}//cout<<l<<endl;length = l.length();for(int i = 0; i < l.length(); i++){if(length - i == len){cout<<"."<<l[i];}else cout<<l[i];}cout<<endl;return 0;
}

B. 数螃蟹

Time limit per test: 2.0 seconds

Memory limit: 512 megabytes

kblack 在做数螃蟹的实验。按照「螃蟹爷爷的秘诀」一书上介绍的:由于东方神秘力量的影响,螃蟹的个数是一个完美的等差数列,例如:2,1,0,1,2,。是的,kblack 的螃蟹比较神奇,有的时候螃蟹的个数可能会是负的。

kblack 每天都去池塘记录螃蟹的个数。但是 kblack 自己给自己放了最多三天的假(也有可能两天,有可能一天,有可能不放),放假的时候螃蟹个数的记录就是 kblack 口胡的,有的时候会假得有点过分。

现给出 kblack n 天的记录,记录中至多有三个数是错误的。请纠正错误并输出正确的实验记录。

Input

第一行是一个整数 n (3n105)。

第二行给出 n 个整数:a1,a2,,an (|ai|109)。

Output

输出正确的实验记录:n 个整数 b1,b2,,bn。输出应是一个等差数列,与输入的数列至多有三个数不同,且保证 |bi|1018

题目保证有解。如果有多解输出任意一解。

Examples

input
5
1 2 4 4 5
output
1 2 3 4 5
input
4
1 3 5 7
output
1 3 5 7
input
4
2 3 3 3
output
4 3 2 1

虽然有去年数青蛙的阴影,但还是勇敢的开了这道题,最后勇敢的1A了。(虽然全场也就过了这一题)

因为最多只有三个数出错,所以只要枚举前五个数的公差看是否满足条件就可以了。

注意小于4的时候特判,输出四个一样的数。

#include <bits/stdc++.h>
const int maxn = 1e5 + 10;
#define eps 1e15
#define ll long long
using namespace std;
ll a[maxn];
ll b[maxn];
//枚举公差
int main()
{//freopen("in.txt","r",stdin);int n;cin>>n;for(int i = 0; i < n; i++){cin>>a[i];}if(n <= 4){for(int i = 0; i < n; i++)cout<<a[0]<<' ';cout<<endl;return 0;}//如小于n直接输出int cnt;for(int i = 1; i < 5 ; i++){for(int j = 0; j < i; j++){cnt = 0;ll d;if((a[i] - a[j]) % (i - j) == 0)d =(a[i] - a[j]) / (i - j);else continue;//向前修正b[j] = a[j];b[i] = a[i];for(int k = j - 1; k >= 0; k--){if((a[j] - (j - k) * d) != a[k])cnt++;b[k] = a[j] - (j - k) * d;}if(cnt > 3) continue;//向后修正for(int k = j + 1; k < n; k++){if((a[j] + (k - j) * d) != a[k])cnt++;b[k] = a[j] + (k - j) * d;if(cnt > 3) break;}if(cnt <= 3)break;}if(cnt <= 3) break;}for(int i = 0 ; i < n; i++)cout<<b[i]<<' ';cout<<endl;
}
C. 面向对象程序设计

Time limit per test: 3.0 seconds

Memory limit: 1024 megabytes

在面向对象程序设计中,常常会运用到函数的扩展与重写。当一个类继承某个类的时候,它可以调用所有父类可以调用的函数。它可以声明新的函数。当新的函数签名与父类的某个函数一致时,就会发生函数的覆盖(重写)。所以,在子类的实例调用某个函数时,它会调用最近的父类(有可能是它自己)的那个函数实现。

这里我们不考虑访问权限等情况,我们只关心某个类在调用某个函数时,这个函数是在哪个类中实现的。

Input

输入具有如下格式:

np2 p3  pnt1 a11 a12  a1t1t2 a21 a22  a2t2tn an1 an2  antnqu1 r1u2 r2uq rq

解释与数据规模约定:

  • n 表示有 n 个类,这些类从 1 到 n 编号。2n105
  • pi 表示第 i 个类的父类编号。1pii1。第 1 个类是所有类共同的祖先类,这个类没有父类。
  • ti 表示在第 i 个类中定义了多少个函数,ai1,ai2,,aiti 表示第 i 个类中的函数列表。同一个类的函数列表中不会出现两个相同的函数。1aij1060ti106,ti106
  • q 表示询问个数。1q105
  • ui,ri 表示第 i 个询问,询问第 ui 个类的实例在调用 ri 函数时,调用的是哪个类中的版本。1uin,1ri106

Output

对于每个询问,输出答案。如果调用不合法(会导致编译错误),输出 1

Examples

input
5
1 2 3 3
2 2 1
0
2 5 2
2 4 5
1 5
4
3 4
5 2
4 5
1 3
output
-1
3
4
-1

C题是比赛时候一直在死杠的题,然而用map存最后超内存了。

正解是离线处理。

要存的东西:每个类的子类列表,每个类的函数列表,每个query的问询顺序和结点函数。

然后自顶向下dfs,每次到达一个结点就把这个结点有的函数全部更新为当前结点。

同时把query里关于这个类的query全部处理好(就是对应函数的栈顶元素、可以根据栈的特性得到)

然后回溯的时候把那些函数pop掉就好了。最后输出即可。

#include <bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn = 1e6 + 10;
using namespace std;
struct query
{int idx,num;query(int a, int b){idx = a;num = b;}
};
vector<query> Q[maxn];//存储所有query
vector<int> son[maxn];//存储每个类的子类
vector<int> cls[maxn];//存储每个类的函数
vector<int> funk[maxn];//函数的栈(用vector模拟)
int ans[maxn];
void dfs(int index)
{for(auto t:cls[index])funk[t].push_back(index);for(auto t:Q[index]){if(funk[t.num].empty())ans[t.idx] = -1;else ans[t.idx] = funk[t.num].back();}for(auto v:son[index])dfs(v);for(auto t:cls[index])funk[t].pop_back();
}
int main()
{int n,q;scanf("%d", &n);for(int i = 2; i <= n; i++){int temp;scanf("%d", &temp);son[temp].push_back(i);//存储每个类的子类}for(int i = 1; i <= n; i++){int T,fun;scanf("%d",&T);while(T--){scanf("%d",&fun);cls[i].push_back(fun);}}scanf("%d", &q);for(int i = 1; i <= q; i++){int k,r;scanf("%d%d", &k, &r);Q[k].push_back(query(i,r));}dfs(1);for(int t = 1; t <= q; t++)cout<<ans[t]<<endl;return 0;
}

这篇关于ECNU第十届程序设计竞赛的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/544740

相关文章

每日一题|牛客竞赛|四舍五入|字符串+贪心+模拟

每日一题|四舍五入 四舍五入 心有猛虎,细嗅蔷薇。你好朋友,这里是锅巴的C\C++学习笔记,常言道,不积跬步无以至千里,希望有朝一日我们积累的滴水可以击穿顽石。 四舍五入 题目: 牛牛发明了一种新的四舍五入应用于整数,对个位四舍五入,规则如下 12345->12350 12399->12400 输入描述: 输入一个整数n(0<=n<=109 ) 输出描述: 输出一个整数

C语言程序设计(数据类型、运算符与表达式)

一、C的数据类型 C语言提供的数据类型: 二、常量和变量 2.1常量和符号常量 在程序运行过程中,其值不能被改变的量称为常量。 常量区分为不同的类型: 程序中用#define(预处理器指令)命令行定义变量将代表常量,用一个标识符代表一个常量,称为符合常量。 2.2变量 变量代表内存中具有特定属性的一个存储单元,用来存放数据,在程序运行期间,这些值是可以 改变的。 变

C语言程序设计(选择结构程序设计)

一、关系运算符和关系表达式 1.1关系运算符及其优先次序 ①<(小于) ②<=(小于或等于) ③>(大于) ④>=(大于或等于 ) ⑤==(等于) ⑥!=(不等于) 说明: 前4个优先级相同,后2个优先级相同,关系运算符的优先级低于算术运算符,关系运算符的优先级高于赋值运算符 1.2关系表达式 用关系运算符将两个表达式(可以是算术表达式或关系表达式,逻辑表达式,赋值表达式,字符

2024年AMC10美国数学竞赛倒计时两个月:吃透1250道真题和知识点(持续)

根据通知,2024年AMC10美国数学竞赛的报名还有两周,正式比赛还有两个月就要开始了。计划参赛的孩子们要记好时间,认真备考,最后冲刺再提高成绩。 那么如何备考2024年AMC10美国数学竞赛呢?做真题,吃透真题和背后的知识点是备考AMC8、AMC10有效的方法之一。通过做真题,可以帮助孩子找到真实竞赛的感觉,而且更加贴近比赛的内容,可以通过真题查漏补缺,更有针对性的补齐知识的短板。

智能工厂程序设计 之1 智能工厂都本俱的方面(Facet,Aspect和Respect)即智能依赖的基底Substrate 之1

Q1、昨天分别给出了三个智能工厂的 “面face”(里面inter-face,外面outer-face和表面surface) 以及每个“面face” 各自使用的“方”(StringProcessor,CaseFilter和ModeAdapter)  。今天我们将继续说说三个智能工厂的“方面” 。在展开之前先看一下三个单词:面向facing,取向oriented,朝向toword。理解这三个词 和

2024 年高教社杯全国大学生数学建模竞赛题目——2024 年高教社杯全国大学生数学建模竞赛题目的求解

2024 年高教社杯全国大学生数学建模竞赛题目 (请先阅读“ 全国大学生数学建模竞赛论文格式规范 ”) 2024 年高教社杯全国大学生数学建模竞赛题目 随着城市化进程的加快、机动车的快速普及, 以及人们活动范围的不断扩大,城市道 路交通拥堵问题日渐严重,即使在一些非中心城市,道路交通拥堵问题也成为影响地方经 济发展和百姓幸福感的一个“痛点”,是相关部门的棘手难题之一。 考虑一个拥有知名景区

2024 年高教社杯全国大学生数学建模竞赛 C 题 农作物的种植策略 参考论文 无水印

持续更新中,2024年数学建模比赛思路代码论文都会发布到专栏内,只需订阅一次!  完整论文+代码+数据结果链接在文末!  订阅后可查看参考论文文件 第一问 1.1 问题重述 这个问题围绕的是华北山区的某乡村,在有限的耕地条件下,如何制定最优的农作物种植策略。乡村有 34 块露天耕地和 20 个大棚,种植条件包括粮食作物、蔬菜、水稻和食用菌。除了要考虑地块的面积、种植季节等,还要确保

kaggle竞赛宝典 | Mamba模型综述!

本文来源公众号“kaggle竞赛宝典”,仅用于学术分享,侵权删,干货满满。 原文链接:Mamba模型综述! 型语言模型(LLMs),成为深度学习的基石。尽管取得了令人瞩目的成就,Transformers仍面临固有的局限性,尤其是在推理时,由于注意力计算的平方复杂度,导致推理过程耗时较长。 最近,一种名为Mamba的新型架构应运而生,其灵感源自经典的状态空间模型,成为构建基础模型的有力替代方案

C语言程序设计 笔记代码梳理 重制版

前言 本篇以笔记为主的C语言详解,全篇一共十章内容,会持续更新基础内容,争取做到更详细。多一句没有,少一句不行!  形而上学者谓之道,形而下学者谓之器 形而上学者谓之道,形而下学者谓之器 第1章 C语言的流程 1.C程序经历的六个阶段 编辑(Edit)预处理(Preprocess)编译(Compile)汇编(Assemble)链接(Link)执行(Execute)  2.

上海市计算机学会竞赛平台2024年7月月赛丙组求和问题

题目描述 给定 nn 个整数 a1,a2,…,ana1​,a2​,…,an​,请问这个序列最长有多少长的前缀,满足元素的和大于或等于 00?如果任何长度大于 00 的前缀之和都为负数,则输出 00 输入格式 第一行:单个整数表示 nn第二行:nn 个整数表示 a1,a2,…,ana1​,a2​,…,an​ 输出格式 单个整数:表示最长的前缀长度,使得前缀的和大于等于 00 数据范围