北理工集训 Day1—Day3 (部分算法题目)

目录

P1824 进击的奶牛

代码实现

P5721 【深基4.例6】数字直角三角形

代码实现

 P1914 小书童——凯撒密码

代码实现

P1097 [NOIP2007 提高组] 统计数字

 代码实现

P6367 [COCI2006-2007#6] PRASE

代码实现

 P2580 于是他错误的点名开始了

代码实现


P1824 进击的奶牛

题目描述

Farmer John建造了一个有N(2<=N<=100,000)个隔间的牛棚,这些隔间分布在一条直线上,坐标是x1,...,xN (0<=xi<=1,000,000,000)。

他的C(2<=C<=N)头牛不满于隔间的位置分布,它们为牛棚里其他的牛的存在而愤怒。为了防止牛之间的互相打斗,Farmer John想把这些牛安置在指定的隔间,所有牛中相邻两头的最近距离越大越好。那么,这个最大的最近距离是多少呢?

输入格式

第1行:两个用空格隔开的数字N和C。

第2~N+1行:每行一个整数,表示每个隔间的坐标。

输出格式

输出只有一行,即相邻两头牛最大的最近距离。

输入输出样例

代码实现

#include <bits/stdc++.h>
using namespace std;
int n, c;
int a[200004];

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

	for (int i = 1; i <= n; i++)

		cin >> a[i];

	sort(a + 1, a + 1 + n);
	int lef = 1, rig = a[n], mid, ans = -1;

	while (lef <= rig) {
		mid = (lef + rig) / 2;
		int lst = a[1], res = c - 1;

		for (int i = 2; i <= n; i++) {

			if (a[i] - lst >= mid) {
				res--;
				lst = a[i];
			}
		}

		if (res <= 0) {
			ans = mid;
			lef = mid + 1;

		} else {
			rig = mid - 1;
		}
	}

	cout << ans << endl;
}

P5721 【深基4.例6】数字直角三角形

题目描述

给出n(1\le n\le13)n(1≤n≤13),请输出一个直角边长度是 nn 的数字直角三角形。所有数字都是 2 位组成的,如果没有 2 位则加上前导 0。

输入格式

输出格式

输入输出样例

代码实现

# include<stdio.h>
int main()
{
	int n,k=1;
	scanf("%d",&n);
	for(int i=1;i<=n;i++)
	{
		for(int j=n;j>=i;j--)
		{
			printf("%02d",k);
			k++;
		}
		printf("\n");
	}
	return 0;
}

 P1914 小书童——凯撒密码

题目背景

某蒟蒻迷上了“小书童”,有一天登陆时忘记密码了(他没绑定邮箱or手机),于是便把问题抛给了神犇你。

题目描述

蒟蒻虽然忘记密码,但他还记得密码是由一个字符串组成。密码是由原文字符串(由不超过 50 个小写字母组成)中每个字母向后移动 nn位形成的。z 的下一个字母是 a,如此循环。他现在找到了移动前的原文字符串及 nn,请你求出密码。

输入格式

第一行:n。第二行:未移动前的一串字母

输出格式

一行,是此蒟蒻的密码

输入输出样例

说明/提示

字符串长度<=50

代码实现

#include <stdio.h>
#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <cstring>
using namespace std;

char s[1000];
int main() {
	int n;
	cin >> n;
	n % 26;
	cin >> s;
	int len = strlen(s);

	for (int i = 0; i < len; i++) {

		s[i] += n;

		if (s[i] > 'z' || s[i] < 'a') {
			s[i] -= 26;
		}

	}

	cout << s << endl;
	return 0;

}

P1097 [NOIP2007 提高组] 统计数字

题目背景

#警告:数据可能存在加强

题目描述

某次科研调查时得到了nn个自然数,每个数均不超过1500000000(1.5 \times 10^9)1500000000(1.5×109)。已知不相同的数不超过1000010000个,现在需要统计这些自然数各自出现的次数,并按照自然数从小到大的顺序输出统计结果。

输入格式

共n+1n+1行。

第一行是整数nn,表示自然数的个数;

第22至n+1n+1每行一个自然数。

输出格式

共mm行(mm为nn个自然数中不相同数的个数),按照自然数从小到大的顺序输出。

每行输出22个整数,分别是自然数和该数出现的次数,其间用一个空格隔开。

输入输出样例

说明/提示

40\%40%的数据满足:1 \le n \le 10001≤n≤1000

80\%80%的数据满足:1 \le n \le 500001≤n≤50000

100\%100%的数据满足:1 \le n \le 2000001≤n≤200000,每个数均不超过1500 000 000(1.5 \times 109)1500000000(1.5×109)

NOIP 2007 提高第一题

 代码实现

#include<stdio.h>
#include<iostream>
#include<cstring>
#include<map>
using namespace std;

map<int,int> m;
int main(){
	int n;
	scanf("%d\n",&n);
	for(int i=1;i<=n;i++){
		int a;
		scanf("%d",&a);
		m[a]++;
	}
	for(map<int,int>::iterator it=m.begin();it!=m.end();it++){
		pair<int,int> p=*it;
		printf("%d %d\n",p.first,p.second);
	}
}

P6367 [COCI2006-2007#6] PRASE

题目描述

孩子们正在餐桌旁吃午餐,共有 nn 份食物,孩子们会按照从 11 至 nn的顺序依次取走这 nn 份食物。

当某个孩子取走了一份食物时,如果这个他之前已经取走的食物份数(不包括当前这一份)比其他人取走的食物份数之和还要多,那么他的妈妈就会提醒他注意自己不礼貌的行为。注意,虽然被妈妈提醒了,但是他仍然会取走这份食物。换句话说,妈妈的提醒对孩子的行为没有任何影响。

给定 nn 份食物分别被哪个孩子取走了,请求出妈妈们一共提醒了多少次。

输入格式

第一行是一个整数,代表食物的份数 nn。

第 22 到第 (n + 1)(n+1) 行,每行一个字符串,第 (i + 1)(i+1) 行的字符串 s_isi​表示取走第 ii 份食物的孩子的名字。

输出格式

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

输入输出样例

说明/提示

样例 1 解释

当取到第 33 份食物时,stanko 已取走的食物(不包括当前这份)的份数是一份,而其他人也总共取走了一份,所以 stanko 的妈妈不会提醒他注意礼貌。

当取到第 44 份食物时,stanko 已经取走两份食物,其他人总共取走了一份食物,因此妈妈会提醒他。


数据规模与约定

对于全部的测试点,保证:

  • 1 \leq n \leq 1001≤n≤100
  • 1 \leq |s_i| \leq 201≤∣si​∣≤20,s_isi​ 中只含小写英文字母。|s_i|∣si​∣ 表示字符串 s_isi​ 的长度。

说明

题目译自 COCI2006-2007 CONTEST #6 T1 PRASE

代码实现

#include <bits/stdc++.h>
using namespace std;
int n;
map<string, int> mp;
string st[200];

int main() {
	cin >> n;
	int ans = 0;

	for (int i = 1; i <= n; i++) {

		string name;
		cin >> name;
		int my = mp[name];
		int other = (i - 1) - my;

		if (my > other)
			ans++;

		mp[name]++;
	}

	cout << ans << endl;
}

 P2580 于是他错误的点名开始了

题目背景

XS中学化学竞赛组教练是一个酷爱炉石的人。

他会一边搓炉石一边点名以至于有一天他连续点到了某个同学两次,然后正好被路过的校长发现了然后就是一顿欧拉欧拉欧拉(详情请见已结束比赛 CON900)。

题目描述

这之后校长任命你为特派探员,每天记录他的点名。校长会提供化学竞赛学生的人数和名单,而你需要告诉校长他有没有点错名。(为什么不直接不让他玩炉石。)

输入格式

第一行一个整数 nn,表示班上人数。

接下来 nn 行,每行一个字符串表示其名字(互不相同,且只含小写字母,长度不超过 5050)。

第 n+2n+2 行一个整数 mm,表示教练报的名字个数。

接下来 mm 行,每行一个字符串表示教练报的名字(只含小写字母,且长度不超过 5050)。

输出格式

对于每个教练报的名字,输出一行。

如果该名字正确且是第一次出现,输出 OK,如果该名字错误,输出 WRONG,如果该名字正确但不是第一次出现,输出 REPEAT

输入输出样例

说明/提示

代码实现

#include <bits/stdc++.h>
using namespace std;
int n;
map<string, int> _list;

int main() {
	cin >> n;

	for (int i = 1; i <= n; i++) {

		string st;
		cin >> st;
		_list[st] = 1;
	}

	int m;
	cin >> m;

	for (int i = 1; i <= m; i++ ) {

		string name;
		cin >> name;

		if ( _list.count(name) ) {
			if (_list[name] == 1) {
				cout << "OK" << endl;
				_list[name] = 0;
			} else {
				cout << "REPEAT" << endl;
			}

		} else {
			cout << "WRONG" << endl;
		}
	}

}

持续更新.....

♥♥♥每天提醒自己,自己就是个菜鸡!

♥♥♥已经看到最后啦,如果对您有帮助留下的每一个点赞、收藏、关注是对菜鸡创作的最大鼓励❀

♥♥♥有相关问题可以写在评论区,一起学习,一起进步。

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

机器人spider

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值