本文主要是介绍洛谷刷题(7),希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!
P8738 [蓝桥杯 2020 国 C] 天干地支
题目描述
古代中国使用天干地支来记录当前的年份。
天干一共有十个,分别为:甲(jiǎ)、乙(yǐ)、丙(bǐng)、丁(dīng)、戊 (wù)、己(jǐ)、庚(gēng)、辛(xīn)、壬(rén)、癸(guǐ)。
地支一共有十二个,分别为:子(zǐ)、丑(chǒu)、寅(yín)、卯(mǎo)、辰(chén)、巳(sì)、午(wǔ)、未(wèi)、申(shēn)、酉(yǒu)、戌(xū)、亥(hài)。
将天干和地支连起来,就组成了一个天干地支的年份,例如:甲子。2020 年是庚子年。
每过一年,天干和地支都会移动到下一个。例如 2021 年是辛丑年。
每过 60 年,天干会循环 6 轮,地支会循环 5 轮,所以天干地支纪年每 60年轮回一次。例如 1900 年,1960 年,2020 年都是庚子年。
给定一个公元纪年的年份,请输出这一年的天干地支年份。
输入格式
输入一行包含一个正整数,表示公元年份。
输出格式
输出一个拼音,表示天干地支的年份,天干和地支都用小写拼音表示(不表示声调),之间不要加入任何多余的字符。
代码
#include<iostream>
using namespace std; // 定义天干和地支的数组
string a[10] = { "jia","yi","bing","ding","wu","ji","geng","xin","ren","gui" }; // 天干
string b[12] = { "zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai" }; // 地支 int main() { int n; // 用户输入的年份 scanf("%d", &n); // 读取用户输入的年份 // 将年份调整到2020年的六十甲子循环中 while (n > 2020) { n -= 60; // 如果年份大于2020,则减去60,回到上一个循环周期 } while (n < 2020) { n += 60; // 如果年份小于2020,则加上60,进入下一个循环周期 } int x = 6, y = 0; // 初始化天干和地支的索引,2020年是庚子年,对应天干索引6(geng),地支索引0(zi) // 从2021年开始,计算到用户输入的年份n的天干地支 for (int i = 2021; i <= n; i++) { x++; // 天干索引递增 if (x == 10) x = 0; // 如果天干索引达到10(即最后一个天干),则重置为0 y = (y + 1) % 12; // 地支索引递增,并取模12保证索引在0到11之间循环 } // 输出计算得到的天干地支 cout << a[x] << b[y]; return 0;
}
P1011 [NOIP1998 提高组] 车站
题目描述
火车从始发站(称为第 1 站)开出,在始发站上车的人数为 a,然后到达第 2 站,在第 2 站有人上、下车,但上、下车的人数相同,因此在第 2 站开出时(即在到达第 3 站之前)车上的人数保持为 a 人。从第 3 站起(包括第 3 站)上、下车的人数有一定规律:上车的人数都是前两站上车人数之和,而下车人数等于上一站上车人数,一直到终点站的前一站(第 n−1 站),都满足此规律。现给出的条件是:共有 n 个车站,始发站上车的人数为 a,最后一站下车的人数是 m(全部下车)。试问 x 站开出时车上的人数是多少?
输入格式
输入只有一行四个整数,分别表示始发站上车人数 a,车站数 n,终点站下车人数 m 和所求的站点编号 x。
输出格式
输出一行一个整数表示答案:从 x 站开出时车上的人数。
代码
#include<stdio.h>
int f[20], g[20];
int main() {int a, n, m, x, ans;scanf("%d%d%d%d", &a, &n, &m, &x);ans = a;if (x >= 3)ans += a;if (x >= 4) {f[1] = f[2] = 1;for (int i = 3; i <= n - 4; i++)f[i] = f[i - 1] + f[i - 2];for (int i = 1; i <= n - 4; i++)g[i] = g[i - 1] + f[i];int y = (m - g[n - 5] * a - ans) / g[n - 4];ans += g[x - 4] * a + g[x - 3] * y;}printf("%d\n", ans);return 0;
}
P1067 [NOIP2009 普及组] 多项式输出
题目描述
一元 nn 次多项式可用如下的表达式表示:
其中,称为 i 次项,称为 i 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:
-
多项式中自变量为 x,从左到右按照次数递减顺序给出多项式。
-
多项式中只包含系数不为 0 的项。
-
如果多项式 n 次项系数为正,则多项式开头不出
+
号,如果多项式 n 次项系数为负,则多项式以-
号开头。 -
对于不是最高次的项,以
+
号或者-
号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 次的项,其系数的绝对值为 1,则无需输出 1)。如果 x 的指数大于 1,则接下来紧跟的指数部分的形式为“xb”,其中 b 为 x 的指数;如果 x 的指数为 1,则接下来紧跟的指数部分形式为 x;如果 x 的指数为 0,则仅需输出系数即可。 -
多项式中,多项式的开头、结尾不含多余的空格。
输入格式
输入共有 2 行
第一行 1 个整数,n,表示一元多项式的次数。
第二行有 n+1 个整数,其中第 i 个整数表示第 n−i+1 次项的系数,每两个整数之间用空格隔开。
输出格式
输出共 1 行,按题目所述格式输出多项式。
代码
#include<stdio.h>int main() {int n, m[200];scanf("%d", &n);for (int i = 1; i <= n + 1; i++) {scanf("%d", &m[i]);}int f = 0;for (int i = 1; i <= n - 1; i++) {if (m[i] == 0)continue;if (m[i] > 0) {if (f == 0) {f = 1;if (m[i] == 1)printf("x^%d", n - i + 1);else printf("%dx^%d", m[i], n - i + 1);continue;}if (m[i] == 1)printf("+x^%d", n - i + 1);else printf("+%dx^%d", m[i], n - i + 1);}else {if (f == 0) {f = 1;if (m[i] == -1)printf("-x^%d", n - i + 1);else printf("%dx^%d", m[i], n - i + 1);continue;}if (m[i] == -1)printf("-x^%d", n - i + 1);else printf("%dx^%d", m[i], n - i + 1);}}if (n > 0) {if (m[n] == 1) printf("+x");else if (m[n] == -1)printf("-x");if (m[n] != 0 && m[n] != 1 && m[n] != -1) {if (m[n] > 0)printf("+%dx", m[n]);else printf("%dx", m[n]);}}if (m[n + 1] > 0) {if (n == 0)printf("%d", m[n + 1]);elseprintf("+%d", m[n + 1]);}if (m[n + 1] < 0)printf("%d", m[n + 1]);return 0;
}
P1563 [NOIP2016 提高组] 玩具谜题
题目背景
NOIP2016 提高组 D1T1
题目描述
小南有一套可爱的玩具小人,它们各有不同的职业。
有一天,这些玩具小人把小南的眼镜藏了起来。小南发现玩具小人们围成了一个圈,它们有的面朝圈内,有的面朝圈外。如下图:
这时 singer 告诉小南一个谜题:“眼镜藏在我左数第 3 个玩具小人的右数第 1 个玩具小人的左数第 2 个玩具小人那里。”
小南发现,这个谜题中玩具小人的朝向非常关键,因为朝内和朝外的玩具小人的左右方向是相反的:面朝圈内的玩具小人,它的左边是顺时针方向,右边是逆时针方向;而面向圈外的玩具小人,它的左边是逆时针方向,右边是顺时针方向。
小南一边艰难地辨认着玩具小人,一边数着:
singer 朝内,左数第 3 个是 archer。
archer 朝外,右数第 1 个是 thinker。
thinker 朝外,左数第 2 个是 writer。
所以眼镜藏在 writer 这里!
虽然成功找回了眼镜,但小南并没有放心。如果下次有更多的玩具小人藏他的眼镜,或是谜题的长度更长,他可能就无法找到眼镜了。所以小南希望你写程序帮他解决类似的谜题。这样的谜題具体可以描述为:
有 n 个玩具小人围成一圈,已知它们的职业和朝向。现在第 1 个玩具小人告诉小南一个包含 m 条指令的谜題,其中第 zz 条指令形如“向左数/右数第 s 个玩具小人”。你需要输出依次数完这些指令后,到达的玩具小人的职业。
输入格式
输入的第一行包含两个正整数 n,m,表示玩具小人的个数和指令的条数。
接下来 n 行,每行包含一个整数和一个字符串,以逆时针为顺序给出每个玩具小人的朝向和职业。其中 0 表示朝向圈内,1 表示朝向圈外。保证不会出现其他的数。字符串长度不超过 10 且仅由英文字母构成,字符串不为空,并且字符串两两不同。整数和字符串之间用一个空格隔开。
接下来 m 行,其中第 i 行包含两个整数 ai,si 表示第 i 条指令。若 ai=0,表示向左数 si 个人;若 ai=1,表示向右数 si 个人。 保证 aiai 不会出现其他的数,1≤si<n。
输出格式
输出一个字符串,表示从第一个读入的小人开始,依次数完 mm 条指令后到达的小人的职业。
代码
#include<stdio.h>
struct date {int number;char name[30];
}a[100005];
int n, m, b, c;
int main() {scanf("%d%d", &n, &m);for (int i = 0; i < n; i++) {scanf("%d %s", &a[i].number, a[i].name);}int p = 0;while(m--) {scanf("%d%d", &b, &c); if ((a[p].number == 0 && b == 0) || (a[p].number == 1 && b == 1)) {//下标减减p = (p + n - c) % n;}else {p = (p + c) % n;}}printf("%s", a[p].name);return 0;
}
P8845 [传智杯 #4 初赛] 小卡和质数
题目背景
小卡最近迷上了质数,所以他想到了一个和质数有关的问题来考考你。
质数是指在大于1的自然数中,除了1和它本身以外不再有其他因数的自然数。
题目描述
小卡有 T(1≤T≤105) 组询问。每次询问给你两个正整数 x,y(1≤x,y≤109)。
小卡想知道,第 x 个质数和第 yy 个质数是否满足 px⊕py=1,即第 x 个质数和第 y 个质数的异或值是否是1。
输入格式
第一行一个正整数 T,表示询问的数量。
接下来 T 行,每行两个正整数 x,y 表示询问的是第 x 个质数和第 y 个质数。
输出格式
T 行,每行一个字符串Yes
或No
,分别表示两个质数的异或值是 1 或不是 1。
代码
#include<stdio.h>int main() {int n;scanf("%d", &n);int a, b;while (n--) {scanf("%d%d", &a, &b);if (a == 1 && b == 2)printf("Yes\n");else if(a==2&&b==1)printf("Yes\n");else printf("No\n");}return 0;
}
这篇关于洛谷刷题(7)的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!