CCF-CSP:2015-09 第五次认证(前4题)

第一题:

数列分段


问题描述

给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?

输入格式

输入的第一行包含一个整数 nn,表示数列中整数的个数。

第二行包含 nn 个整数 a1,a2,…,ana1,a2,…,an,表示给定的数列,相邻的整数之间用一个空格分隔。

输出格式

输出一个整数,表示给定的数列有多个段。

数据范围

1≤n≤10001≤n≤1000,
0≤ai≤10000≤ai≤1000

输入样例:
8
8 8 8 0 12 12 8 0
输出样例:
5
样例解释

8 8 8 是第一段,0 是第二段,12 12 是第三段,倒数第二个整数 8 是第四段,最后一个 0 是第五段。


解决方案:

#include<iostream>
#include<algorithm>
using namespace std;
int main()
{
	int n,res=1;
	int a[1010];
	cin>>n;
	cin>>a[0];
	for(int i=1;i<n;i++){
		cin>>a[i];
		if(a[i]!=a[i-1]){
			res++;
		}
	}
	
	cout<<res<<endl;
	return 0;
}

第二题:

日期计算


问题描述

给定一个年份 yy 和一个整数 dd,问这一年的第 dd 天是几月几日?

注意闰年的 22 月有 2929 天。

满足下面条件之一的是闰年:

  1. 年份是 44 的整数倍,而且不是 100100 的整数倍;
  2. 年份是 400400 的整数倍。
输入格式

输入的第一行包含一个整数 yy,表示年份,年份在 19001900 到 20152015 之间(包含 19001900 和 20152015)。

输入的第二行包含一个整数 dd,dd 在 11 至 365365 之间。

输出格式

输出两行,每行一个整数,分别表示答案的月份和日期。

数据范围

1900≤y≤20151900≤y≤2015,
1≤d≤3651≤d≤365

输入样例1:
2015
80
输出样例1:
3
21
输入样例2:
2000
40
输出样例2:
2
9

解决方案:

#include<iostream>
#include<algorithm>
using namespace std;
int months[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int is_leap(int year)
{
	if((year%400==0)||(year%4==0&&year%100!=0)){
		return 1;
	}
	return 0;
}
int get_days(int year,int month)
{
	if(month==2){
		return months[month]+is_leap(year);
	}
	return months[month];
}
int main()
{
	int y,d;
	cin>>y>>d;
	int day=0;
	for(int i=1;i<=12;i++){
		day+=get_days(y,i);
		if(day>=d){
			printf("%d\n",i);
			printf("%d\n",d-(day-get_days(y,i)));
			break;
		}
	}
	return 0;
	
}

第三题:

模板生成系统


问题描述

成成最近在搭建一个网站,其中一些页面的部分内容来自数据库中不同的数据记录,但是页面的基本结构是相同的。

例如,对于展示用户信息的页面,当用户为 Tom 时,网页的源代码是

p1.png

而当用户为 Jerry 时,网页的源代码是

p2.png

这样的例子在包含动态内容的网站中还有很多。

为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统。

模板是包含特殊标记的文本。

成成用到的模板只包含一种特殊标记,格式为 {{ VAR }},其中 VAR 是一个变量。

该标记在模板生成时会被变量 VAR 的值所替代。

例如,如果变量 name = "Tom",则 {{ name }} 会生成 Tom

具体的规则如下:

  • 变量名由大小写字母、数字和下划线 _ 构成,且第一个字符不是数字,长度不超过 1616 个字符。
  • 变量名是大小写敏感的,Name 和 name 是两个不同的变量。
  • 变量的值是字符串。
  • 如果标记中的变量没有定义,则生成空串,相当于把标记从模板中删除。
  • 模板不递归生成。也就是说,如果变量的值中包含形如 {{ VAR }} 的内容,不再做进一步的替换。
输入格式

输入的第一行包含两个整数 m,nm,n,分别表示模板的行数和模板生成时给出的变量个数。

接下来 mm 行,每行是一个字符串,表示模板。

接下来 nn 行,每行表示一个变量和它的值,中间用一个空格分隔。值是字符串,用双引号 " 括起来,内容可包含除双引号以外的任意可打印 ASCII 字符(ASCII 码范围 32,33,35−12632,33,35−126)。

输出格式

输出包含若干行,表示模板生成的结果。

数据范围

0≤m≤1000≤m≤100,
0≤n≤1000≤n≤100,
输入的模板每行长度不超过 8080 个字符(不包含换行符)。
输入保证模板中所有以 {{ 开始的子串都是合法的标记,开始是两个左大括号和一个空格,然后是变量名,结尾是一个空格和两个右大括号。
输入中所有变量的值字符串长度不超过 100100 个字符(不包括双引号)。
保证输入的所有变量的名字各不相同。(同一变量在模板中可能出现多次,参见样例)

输入样例:
11 2
<!DOCTYPE html>
<html>
<head>
<title>User {{ name }}</title>
</head>
<body>
<h1>{{ name }}</h1>
<p>Email: <a href="mailto:{{ email }}">{{ email }}</a></p>
<p>Address: {{ address }}</p>
</body>
</html>
name "David Beckham"
email "david@beckham.com"
输出样例:
<!DOCTYPE html>
<html>
<head>
<title>User David Beckham</title>
</head>
<body>
<h1>David Beckham</h1>
<p>Email: <a href="mailto:david@beckham.com">david@beckham.com</a></p>
<p>Address: </p>
</body>
</html>

解决方案:

#include<iostream>
#include<cstring>
#include<algorithm>
#include<vector>//出现多行字符串,都需要保存时,把每行存入vector中
#include<unordered_map>//哈希表,题中出现了变量和它的值,就考虑哈希表(key,value)
using namespace std;

int main()
{
	int n,m;
	cin>>m>>n;
	getchar();
	vector<string> strs;
	unordered_map<string,string> vars;
	for(int i=0;i<m;i++){
		string str;
		getline(cin,str);
		strs.push_back(str);
	}
	for(int i=0;i<n;i++){
		string key,value;
		cin>>key;
		char ch;
		getchar();
		getchar();
		while(ch=getchar(),ch!='\"'){
			value+=ch;
		}
		vars[key]=value;
	}
	for(auto&str:strs){
		for(int i=0;i<str.size();){
			if(i+2<str.size()&&str[i]=='{'&&str[i+1]=='{'&&str[i+2]==' '){
				int j=i+3;
				string c;
				while(str[j]!=' '&&str[j+1]!='}'&&str[j]!='}'){
					c+=str[j];
					j++;
				}
				cout<<vars[c];
				i=j+3;
			}
			else{
				cout<<str[i];
				i++;
			}
		}
		cout<<endl;
	}
 } 

第四题:

高速公路


问题描述

某国有 nn 个城市,为了使得城市间的交通更便利,该国国王打算在城市之间修一些高速公路,由于经费限制,国王打算第一阶段先在部分城市之间修一些单向的高速公路。

现在,大臣们帮国王拟了一个修高速公路的计划。

看了计划后,国王发现,有些城市之间可以通过高速公路直接(不经过其他城市)或间接(经过一个或多个其他城市)到达,而有的却不能。

如果城市 AA 可以通过高速公路到达城市 BB,而且城市 BB 也可以通过高速公路到达城市 AA,则这两个城市被称为便利城市对。

国王想知道,在大臣们给他的计划中,有多少个便利城市对。

输入格式

输入的第一行包含两个整数 n,mn,m,分别表示城市和单向高速公路的数量。

接下来 mm 行,每行两个整数 a,ba,b,表示城市 aa 有一条单向的高速公路连向城市 bb。

输出格式

输出一行,包含一个整数,表示便利城市对的数量。

数据范围

前 30%30% 的评测用例满足 1≤n≤100,1≤m≤10001≤n≤100,1≤m≤1000;
前 60%60% 的评测用例满足 1≤n≤1000,1≤m≤100001≤n≤1000,1≤m≤10000;
所有评测用例满足 1≤n≤10000,1≤m≤1000001≤n≤10000,1≤m≤100000。

输入样例:
5 5
1 2
2 3
3 4
4 2
3 5
输出样例:
3
样例解释

p4.png

城市间的连接如图所示。

有 33 个便利城市对,它们分别是 (2,3),(2,4),(3,4)(2,3),(2,4),(3,4),请注意 (2,3)(2,3) 和 (3,2)(3,2) 看成同一个便利城市对。


解决方案:

这道题就是求所有的强连通分量,使用tarjan算法,历年来只考了这一次,这个算法还不太好理解,所以没写(✿◕‿◕✿)

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值