第一题:
数列分段
问题描述
给定一个整数数列,数列中连续相同的最长整数序列算成一段,问数列中共有多少段?
输入格式
输入的第一行包含一个整数 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 天。
满足下面条件之一的是闰年:
- 年份是 44 的整数倍,而且不是 100100 的整数倍;
- 年份是 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
时,网页的源代码是
而当用户为 Jerry
时,网页的源代码是
这样的例子在包含动态内容的网站中还有很多。
为了简化生成网页的工作,成成觉得他需要引入一套模板生成系统。
模板是包含特殊标记的文本。
成成用到的模板只包含一种特殊标记,格式为 {{ 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
样例解释
城市间的连接如图所示。
有 33 个便利城市对,它们分别是 (2,3),(2,4),(3,4)(2,3),(2,4),(3,4),请注意 (2,3)(2,3) 和 (3,2)(3,2) 看成同一个便利城市对。
解决方案:
这道题就是求所有的强连通分量,使用tarjan算法,历年来只考了这一次,这个算法还不太好理解,所以没写(✿◕‿◕✿)