目录

  • [Problem 1110](https://xjoi.net/problem/1110) 某年某月有几天
    • 一 题目内容
    • 二 新知识点
      • 2.1 一维数组
    • 三 思路
    • 四 AC代码
  • [Problem 9358](https://xjoi.net/problem/9358) Maoge的游戏
    • 一 题目内容
    • 二 新知识点
    • 三 思路
    • 四 AC代码
  • [Problem 9354](https://xjoi.net/problem/9354) maoge的硬币
    • 一 题目内容
    • 二 新知识点
    • 三 思路
    • 四 AC代码
  • [Problem 1197](https://xjoi.net/problem/1197) 小帅打电话
    • 一 题目内容
    • 二 新知识点
      • 2.1 while循环
    • 三 思路
    • 四 AC代码
  • [Problem 9302](https://xjoi.net/problem/9302) 自动找人系统
    • 一 题目内容
    • 二 新知识点
      • 2.1 long long类型
      • 2.2 nnn进制
    • 三 思路
    • 四 AC代码
  • [Problem 3904](https://xjoi.net/problem/3904) 年龄计算
    • 一 题目内容
    • 二 新知识点
    • 三 思路
    • 四 AC代码

Problem 1110 某年某月有几天

一 题目内容

时间:1s 空间:256M
题目描述:
闰年问题:已知某年某月,计算该月有几天。
输入格式:
输入一行,包含两个正整数 year,monthyear,monthyear,month ,代表年和月。
输出格式:
输出一行,包含一个整数。
样例输入:
200420042004 222
样例输出:
292929

二 新知识点

2.1 一维数组

当我们要记录 444 个数据时,我们可以使用 a0a1a2a3 四个变量进行记录。但如果数据大小开到 100100100,100010001000,乃至 10610^6106 呢?是不是还要用“开 10610^6106 个变量”这种原始的方法呢?
答案当然是否定的。这时要引入一个新的概念——一维数组。一个一位数组中可以包含许多个元素(即变量)。一维数组在内存上是连续的,也就是说,你可以直接在与访问一个变量相同的时间内访问数组的某一个元素。其声明如下所示:

int a[10]; //当然也可以换成别的数据类型

这句代码的意思是,开一个长度为 101010 的一维数组。在介绍其操作之前,先介绍“下标”的概念。“下标”指访问的元素编号,即现在访问的是第几个元素。
一维数组的基本操作有以下几种(假设 a 数组已声明):
(1)访问某一下标的元素的值:

cout<<a[0];

注意,数组下标从 000 开始,即 000 号元素才是一个数组实际上的开始。因此,上面例子中的 a[10] 实际上包含的下标是 0∼90 \sim 90∼9。
(2)输入数组中的 nnn 个数(下标为 0∼n−10 \sim n-10∼n−1):

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

这表明数组的某个下标是可以单独输入的,如:

cin>>a[0]; //输入a数组的第0个下标的值

当然,字符数组也可以像这样输入:

cin>>a;

这样,字符数组 a 中会存入整个字符串(每个下标只有一个字符)加上一个 ‘\0’ 表示终止符。所以,如果要像上例一样输入字符数组,记得把数组开大点!

(3)数组的初始化:

//方法一:给数组全部元素全部赋值为空(字符'',布尔值false,整数与浮点数0)
int a[10]={};
//方法二:给部分或全部元素赋值
int b[7]={1,2,3,4,5,6,7}; //实际上是初始化了b数组下标0到6的值,而不是下标1到7的值(况且b数组根本没有下标7!)
char c[10]={'I','O','I'}; //c数组中只会有'I','O','I'三个字符,不会有终止符'\0'

三 思路

判断一年 yearyearyear 是否为闰年的方法如下:
(1)若 year%4!=0year\%4!=0year%4!=0,则该年不是闰年。
(2)若 year%4==0year\%4==0year%4==0 但 year%100!=0year\%100!=0year%100!=0,则该年是闰年。
(3)若 year%100==0year\%100==0year%100==0 但 year%400!=0year\%400!=0year%400!=0,则该年不是闰年。
(4)若 year%400==0year\%400==0year%400==0,则该年是闰年。
随后开一维数组记录 121212 个月的天数(222 月特殊处理,存为 000),最后访问数组并输出即可(同样地,222 月特殊处理)。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){int y,m; //year和month的简写cin>>y>>m;int d[13]={0,31,0,31,30,31,30,31,31,30,31,30,31}; //存储每个月的天数//注意,月份从1开始,但数组下标从0开始,因此要在下标0处填入一个无意义的数值进行占位if(m==2){if((year%4==0&&year%100!=0)||(year%400==0)){ //判断闰年(特殊处理2月)cout<<29;}else{cout<<28;}}else{cout<<d[m];}return 0;
}

Problem 9358 Maoge的游戏

一 题目内容

【题目描述】
maoge 和 maoge233 玩一个游戏。
他有两堆石子,每次可以选择任意一堆取任意个(至少一个),当一个人没有石子可取时,就输了。
maoge 先取,问最后谁能赢。假设都是以最优策略。
【数据格式】
输入第一行两个数 x,yx,yx,y 表示两堆石子分别的数量(x,y≤100000x,y \leq 100000x,y≤100000)
输出 maoge 或者 maoge233
样例输入:
111 222
样例输出:
maogemaogemaoge

二 新知识点

本题没有新知识点。

三 思路

注:本题涉及到博弈论有关知识。
考虑 maoge 如何使自己必胜:设法使场上只剩一堆石子,这时轮到自己取时就一定会赢。可以证明,这是唯一的必胜方法,可惜我不会证明。因为 maoge 先手,所以它具有主动权。他可以使两堆石子的个数相等,这样就可以使用“copy 大法”进行博弈,即如果 maoge233 在一堆石子中取了 aaa 个,那么 maoge 就可以在另一堆石子中取 xxx 个。可以证明,这是一种必胜策略,因为最终场上一定会只剩一堆石子,可惜我仍然不会证明。但如果开始时两堆石子数量相等,那么 maoge 只能被逼着令两堆石子数量不等,maoge233 就可以再次使两堆石子数量相等,再运用“copy 大法”使自己胜利。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){int x,y;cin>>x>>y;if(x==y){ //第二种情况,maoge233必胜cout<<"maoge233";}else{ //第一种情况,maoge必胜cout<<"maoge";}return 0;
}
//所以你思路分析讲了那么多,结果代码就这么点?
//是的......

Problem 9354 maoge的硬币

一 题目内容

【题目描述】
maoge 的桌子上有 444 枚硬币,有些正面朝上,有些反面朝上。现在 maoge 想请你帮他把这些硬币都变成同一面朝上,但是你每次能且只能翻三个硬币,请你求出最少翻转次数。
【数据格式】
输入一行,四个数字 000 或 111,表示每个硬币的初始状态。
输出一个数,表示答案。
样例输入:
111 000 111 111
样例输出:
111

二 新知识点

本题没有新知识点。

三 思路

显然,当场上的 111 个数相同时,所需的翻转次数也相同。因此,我们只需考虑以下五种情况:
(1)场上全是 000,此时不用翻硬币。
(2)场上有一个 111,三个 000,此时把三个 000 变成 111即可,共翻转 111 次。
(3)场上有两个 111 和两个 000,此时显然不能只翻一次硬币了,至少翻转两次,方法如下所示(以初始状态 000 000 111 111 为例):
初始状态:000 000 111 111
翻转一次:111 000 000 000
翻转两次:111 111 111 111
(4)场上有三个 111 和一个 000,分析大体同(2)。
(5)场上全是 111,分析大体同(1)。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){int a,b,c,d;cin>>a>>b>>c>>d;int s=a+b+c+d; //求场上1的数量if(s==0||s==4){cout<<0;}else if(s==1||s==3){cout<<1;}else{cout<<2;}return 0;
}

Problem 1197 小帅打电话

一 题目内容

时间:1s 空间:256M
题目描述:
“喂,CCF 么?”

“您好,这里是 CCF”

“哦,再见”
“…”
学军中学小帅给 CCF 打了一通奇怪的电话。因为他发现了前三分钟的电话费太便宜了,于是他准备用完三分钟挂电话,接着打。
CCF 一脸懵逼。。。
打完电话,小帅回到了学军机房,他开始思考刚才碰到的算法问题。
假如通话时间小于等于 333 分钟话费都是 basebasebase 块钱,大于三分钟以后每分钟按 aboveaboveabove 块钱算,你有 totaltotaltotal 块钱。问你最长能打多久电话。
输入格式:
输入一行,包含三个整数 base,above,totalbase,above,totalbase,above,total
输出格式:
输出一行,包含一个整数
样例输入:
222 111 444
样例输出:
666
约定:
1≤base,above≤100,1≤total≤100001 \leq base,above \leq 100,1 \leq total \leq 100001≤base,above≤100,1≤total≤10000

二 新知识点

2.1 while循环

现有一个正整数 aaa。你想要求出 a3\frac{a}{3}3a​ 向上取整的结果(即第一个大于等于 a3\frac{a}{3}3a​ 的数的大小),且不准使用内置函数,该怎么做呢?我们考虑不停地把 aaa 减去 333,直到 a≤0a \leq 0a≤0 为止。要实现这一功能,就需要用到 while 循环,它可以在满足一定条件时自动退出循环,格式如下:

while(不退出循环的条件){ //注意,是“不退出循环”的条件!语句
}

使用 while 循环,我们可以编写出死循环(即不会停止的循环):

while(1){ //即while(true)语句
}

这时,只能按 Ctrl+C 组合键强制退出程序。

三 思路

比较单位时间(这里我取的是一分钟)内 basebasebase 和 aboveaboveabove 的价格,再进行比较,决定使用下面的哪种方案:
(1)单位时间内 aboveaboveabove 更贵,则不停地打三分钟的电话,挂断,再打,挂断,再打,…\ldots… …\ldots…
(2)单位时间内一样贵或 basebasebase 更贵,就只打一次电话,一直打到底。
但是,如果小帅连 basebasebase 元钱都付不起,那他只能喝西北风不打电话了。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){int base,above,total,s,minute=0;double value1,value2;cin>>base>>above>>total;if(total<base){ //特判没钱的情况cout<<0;}else{//计算价值value1=1.0*base/3;value2=1.0*above;s=total; //让变量名好写一点,其实没必要if(value1<value2){ //判断价值大小while(s>0){ //尽量使用bases-=base;minute+=3;}if(s<0){ //处理冗余s+=base;minute-=3;}while(s>0){ //base不够,above来凑s-=above;minute++;}if(s<0){ //处理冗余s+=above;minute--;}}else{s-=base;minute+=3;while(s>0){ //一打到底!s-=above;minute++;}if(s<0){ //处理冗余s+=above;minute--;}}cout<<minute;}return 0;
}

Problem 9302 自动找人系统

一 题目内容

【题目描述】
给定三个参数 a,b,ca,b,ca,b,c,表示年,月,日,(不考虑闰年)表示一个时间节点。他要找出在两个时间节点之间的时间(包括两个时间节点本身)。现在给定两个时间节点和一个时间,他要判断这个时间是否在这个时间段之中。
【数据格式】
输入三行,三个时间,每行有三个数,表示年月日。前两行表示两个时间节点(不一定按照第一个小于第二个的顺序给出),最后一行是这个时间发生的时间。保证合法。
输出一个 Yes 或者 No 表示是否在这个时间段之中。
样例输入:
200720072007 111 111
200720072007 121212 313131
200720072007 333 222222
样例输出:
YesYesYes

二 新知识点

2.1 long long类型

我们知道,int 类型的存储范围是 [−231,231−1][-2^{31},2^{31}-1][−231,231−1],即 [−2147483648,2147483647][-2147483648,2147483647][−2147483648,2147483647]。如何存储更大的数呢?可以用一种类似于 int 类型的整数类型——long long 类型。其存储范围是 [−263,263−1][-2^{63},2^{63}-1][−263,263−1],即 [−9223372036854775808,9223372036854775807][-9223372036854775808,9223372036854775807][−9223372036854775808,9223372036854775807],达到了 9×10189 \times 10^{18}9×1018 以上的数量级。其运算操作与 int 类型基本相同。

2.2 nnn进制

我们平常使用的数都是十进制的,如数 123451234512345。这种数的进位规则是“逢十进一”,即某一位上的数一旦 ≥10\geq 10≥10,就向高位进 111。但 nnn 进制数的进位规则是“逢 nnn 进一”,即某一位上的数一旦 ≥n\geq n≥n,就向高位进 111。nnn 进制数 aaa 记作 (a)n(a)_n(a)n​。
根据位值原理,设 (a)n(a)_n(a)n​ 有 xxx 位,并记 (a)n(a)_n(a)n​ 从低到高的第 kkk 位为 k(a)n^k(a)_nk(a)n​(虽然这种记法很不规范,但有助于理解),其中 k∈[1,n]∪Zk \in [1,n] \cup \mathbb{Z}k∈[1,n]∪Z,则 (a)n=∑i=1ni(a)n×ni−1(a)_n=\sum_{i=1}^n {}^i(a)_n \times n^{i-1}(a)n​=i=1∑n​i(a)n​×ni−1,其中右边的式子的结果是 (a)n(a)_n(a)n​ 的十进制表示。

三 思路

如果分每一种情况来看,虽然可以 AC\color{red}ACAC,但代码太繁琐,因此考虑换一种思路。
把三个日期看作未完全进位的 323232 进制数(因为月份和日期均不超过 313131,但不知道年份的范围,因此直接乘以 322=102432^2=1024322=1024,对结果没有影响),将其转化为十进制数,但怕年份取到一个很刁钻的数(如 10910^9109),于是开 long long 存储 323232 进制数转化后的结果。这样,只要确认第三个转化后的数是否在前两个转化后的数之间即可(注意到 swap(a,b) 可用于任何数据类型,所以在必要时只需用 swap 交换两数即可)。

四 AC代码

#include<bits/stdc++.h>
using namespace std;
int main(){long long a1,b1,c1,a2,b2,c2,a3,b3,c3; //存储三个日期cin>>a1>>b1>>c1>>a2>>b2>>c2>>a3>>b3>>c3;long long r1=a1*1024+b1*32+c1,r2=a2*1024+b2*32+c2,r3=a3*1024+b3*32+c3; //32进制转十进制if(r1>r2)swap(r1,r2);if(r3>=r1&&r3<=r2){cout<<"Yes";}else{cout<<"No";}return 0;
}

Problem 3904 年龄计算

一 题目内容

时间:1s 空间:256M

题目描述
编写程序,输入某人的生日(年、月、日),并输入当前的日期(年、月、日),输出他的实际年龄(周岁),若生日超过当前日期,输出“-1”。
输入格式
6个整数,分别表示该学生的生日(年、月、日)和当前的日期(年、月、日)
输出格式
一个整数.
样例输入
1990 2 28
2000 3 4
样例输出
10
约定
保证输入数据是合法的日期

二 新知识点

本题没有新知识点。

三 思路

依据每种情况判断即可(本题这样做代码不繁琐)。

四 AC代码

#include<iostream>
using namespace std;
int main(){int a1,b1,c1,a2,b2,c2; //存储两个日期cin>>a1>>b1>>c1>>a2>>b2>>c2;if(a1>a2){ //生日年份大于现在年份cout<<-1;}else if(a1==a2){ //生日年份等于现在年份if(b1>b2){cout<<-1;}else if(b1==b2){if(c1>c2){cout<<-1;}else if(c1==c2){cout<<0;}else if(c1<c2){cout<<0;}}else if(b1<b2){cout<<0;}}else if(a1<a2){ //生日年分小于现在年份int y=a2-a1;if(b1==b2){if(c1<c2){cout<<y;}else if(c1==c2){cout<<y;}else if(c1>c2){cout<<y-1;}}else if(b1<b2){cout<<y;}else if(b1>b2){cout<<y-1;}}return 0;
}

XJOI一级六段题解(g++,即C++),也可视作C++算法竞赛教程相关推荐

  1. XJOI一级四段题解(g++,即C++),也可视作C++算法竞赛教程

    目录 Problem 3536 判断奇偶性 一 题目内容 二 新知识点 三 思路 四 AC代码 Problem 1112 交换变量 一 题目内容 二 新知识点 2.1 swap(a,b)的用法 三 思 ...

  2. XJOI一级三段题解(g++,即C++),也可视作C++算法竞赛教程

    目录 Problem 3567 浮点数 一 题目内容 二 新知识点 2.1 对浮点数精度要求的处理与另一种标准输出 三 思路 四 AC代码 Problem 3572 浮点除法 一 题目内容 二 新知识 ...

  3. android wear升级方法,LG G Watch官方工具包刷Android wear5.1.1教程(附刷机包)

    Android wear5.1.1版本已经开始推送更新了,不过很多LG G Watch的用户已经迫不及待想要升级到5.1.1版本了,下面小编就为大家介绍一下LG G Watch官方工具包刷Androi ...

  4. 《算法竞赛进阶指南(by 李煜东)》习题题解 集合

    又是笔者给自己挖的大坑. 这里是李煜东所著<算法竞赛进阶指南(by 李煜东)>的习题题解集合. 有任何错误请在对应文章下反馈或联系 nicest1919@163.com ,谢谢 qwq 从 ...

  5. 第三届上海市青少年算法竞赛题解

    第三届上海市青少年算法竞赛题解 T1 数洞洞 #include<bits/stdc++.h> using namespace std; int a[11]={0,1,0,0,0,1,0,1 ...

  6. UVA-1598 交易所 题解答案代码 算法竞赛入门经典第二版

    GitHub - jzplp/aoapc-UVA-Answer: 算法竞赛入门经典 例题和习题答案 刘汝佳 第二版 AC代码 有意思的一个题目.书上说这是一个不错的优先队列练习题,但实际上它其实是一个 ...

  7. XJOI 3287 离散化 题解

    时间:1s 空间:128M 题目描述: 给你n个数,输出这n个数离散化后的结果 比如4 100 80 10000 离散化后为1 3 2 4 每个数的值为在原先数组中大小的排名,相同排名输出相同. 如1 ...

  8. `算法竞赛题解` `LeetCode` 6126. 设计食物评分系统

    题目链接 题目 设计一个支持下述操作的食物评分系统: 修改 系统中列出的某种食物的评分. 返回系统中某一类烹饪方式下评分最高的食物. 实现 FoodRatings 类: FoodRatings(Str ...

  9. 【B站视频教程笔记】基于VSCode和CMake实现C/C++开发 | Linux篇(gcc/g++)(安装、配置、使用详细教程)(VSCode教程)(CMake教程)(精!)

    基于VSCode和CMake实现C/C++开发 | Linux篇 文章目录 目录结构 文件编辑 vim(编辑器之神,linux里可以畅通无阻,必学,但不是现在!) 安装GCC和GDB g++编译过程 ...

  10. 【HIBERNATE框架开发之九】HIBERNATE 性能优化笔记!(遍历、一级/二级/查询/缓存、乐观悲观锁等优化算法)...

    本站文章均为 李华明Himi 原创,转载务必在明显处注明:  转载自[黑米GameDev街区] 原文链接: http://www.himigame.com/hibernate/825.html 1. ...

最新文章

  1. Oracle Database 11.2.0.4.0 已在 中标麒麟Linux x86-64 NeoKylin Linux Advanced Server 6 上通过认证...
  2. jupyter分割代码块_科研分享—Python根据关键词自动抓取Pubmed文献标题(附全部代码)文末有福利...
  3. R语言gganimate包创建可视化gif动图:gganimate包创建动态线型图动画基于transition_time函数、使用geom_point函数显示动画移动的数据点、并保留线图中的全部数据点
  4. 五分钟内搭建的混沌电路
  5. JavaScript工作原理(二):V8引擎和5招高效代码
  6. mysql连接编程环境_C++连接MySQL(一):环境配置和实例
  7. 超级计算机换算成智商,全球第二超级计算机运算力不如人脑 《转》
  8. c语言中二维数组怎么,c语言中什么是二维数组
  9. java基础File的简单使用记录
  10. SAP Leonardo机器学习训练之前的初始化操作
  11. 【探索HTML5第二弹05】响应式布局(中),一步一步响应式布局
  12. JAVA 搭建基于SPRINGBOOT的SSM(SPRING + SPRINGMVC + MYBATIS)的MAVEN项目
  13. 机器学习笔记(一)----基本概念
  14. 怎么把matlab中的图导出,matlab的数据能保存到excel表格-如何将matlab 中输出的图形保存到Excel中去,详细点...
  15. 权限申请弹框_安卓Q | 位置权限三态化解析,用户要关心,开发者须警惕!
  16. 【视频开发】【Live555】摄像头采集,264编码,live555直播
  17. vue 实现12个月的平铺式日历插件
  18. 今天来聊聊CAD的“外挂”
  19. 手机九宫格解锁所有可能
  20. 和睦小镇保卫战服务器位置,植物大战僵尸和睦小镇保卫战隐藏黄金地精及机关位置汇总[多图]...

热门文章

  1. 数据处理——偏最小二乘法
  2. 普中28335开发攻略_TMS320F28335项目开发记录5_28335之CCS编程基础
  3. 转专业后的迷茫和开始——自学C语言之旅
  4. Vue开发工具dev-tools的安装与使用
  5. markDown 下载安装教程
  6. comsol3.5 软件下载
  7. 2路10核物理服务器能否虚拟40vcpu,XenServer中Windows 7与XP多vCPU支持配置,cpu 2 核限制...
  8. HTML作业制作服装推广软文,盘点:服装推广软文写作技巧
  9. 三星全新贴片机SM421(S)参数性能!
  10. 无法登录 mysql 服务器_无法登录 MySQL服务器/无法开启 MySQL服务