洛谷刷题(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 次项的系数。给出一个一元多项式各项的次数和系数,请按照如下规定的格式要求输出该多项式:

  1. 多项式中自变量为 x,从左到右按照次数递减顺序给出多项式。

  2. 多项式中只包含系数不为 0 的项。

  3. 如果多项式 n 次项系数为正,则多项式开头不出 + 号,如果多项式 n 次项系数为负,则多项式以 - 号开头。

  4. 对于不是最高次的项,以 + 号或者 - 号连接此项与前一项,分别表示此项系数为正或者系数为负。紧跟一个正整数,表示此项系数的绝对值(如果一个高于 0 次的项,其系数的绝对值为 1,则无需输出 1)。如果 x 的指数大于 1,则接下来紧跟的指数部分的形式为“xb”,其中 b 为 x 的指数;如果 x 的指数为 1,则接下来紧跟的指数部分形式为 x;如果 x 的指数为 0,则仅需输出系数即可。

  5. 多项式中,多项式的开头、结尾不含多余的空格。

输入格式

输入共有 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]);
		else
			printf("+%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 行,每行一个字符串YesNo,分别表示两个质数的异或值是 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;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值