luogu 基础题

23 篇文章 1 订阅

P1116 车厢重组

题目描述

在一个旧式的火车站旁边有一座桥,其桥面可以绕河中心的桥墩水平旋转。一个车站的职工发现桥的长度最多能容纳两节车厢,如果将桥旋转180度,则可以把相邻两节车厢的位置交换,用这种方法可以重新排列车厢的顺序。于是他就负责用这座桥将进站的车厢按车厢号从小到大排列。他退休后,火车站决定将这一工作自动化,其中一项重要的工作是编一个程序,输入初始的车厢顺序,计算最少用多少步就能将车厢排序。

输入输出格式

输入格式:

输入文件有两行数据,第一行是车厢总数N(不大于10000),第二行是N个不同的数表示初始的车厢顺序。

输出格式:

一个数据,是最少的旋转次数。

输入输出样例

输入样例#1:
4
4 3 2 1 
输出样例#1:
6

#include<iostream>
using namespace std;
#include<algorithm>


int main()
{
	int n,s=0;
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++)
	{
		cin>>a[i];
	}
	for(int i=0;i<n-1;i++)
		for(int j=1;j<n-i;j++)
		{
			if(a[j]<a[j-1])
			{
				swap(a[j],a[j-1]);
				s++;
			}
		}
	cout<<s<<endl;
	return 0;
}

P2192 HXY玩卡片

目描述

HXY得到了一些卡片,这些卡片上标有数字0或5。现在她可以选择其中一些卡片排成一列,使得排出的一列数字组成的数最大,且满足被90整除这个条件。同时这个数不能含有前导0,即0不能作为这串数的首位。如果不能排出这样的数,输出“-1”。

输入输出格式

输入格式:

第一行,卡片的个数n。

第二行,分别给出了这n个数(只能为数字5或0)。

输出格式:

仅一行,如果可以排出,则输出这个数。否则输出“-1”。

输入输出样例

输入样例#1:
4
5 0 5 0
输出样例#1:
0
输入样例#2:
11
5 5 5 5 5 5 5 5 0 5 5
输出样例#2:
5555555550

说明

数据范围:

对于30%的数据,n<=10;

对于20%的数据,仅含数字5;

对于100%的数据,n<=1000。


#include<iostream>
using namespace std;

int main()
{
	int n;
	cin>>n;
	int a,x=0,y=0;
	for(int i=0;i<n;i++)
	{
		cin>>a;
		if(a==5)
			x++;
		else
			y++;
	}
	if(y==0)
		cout<<-1<<endl;
	else if(x<9)
		cout<<0<<endl;
	else
	{
		x-=x%9;
		for(int i=0;i<x/9;i++)
			cout<<"555555555";
		for(int i=0;i<y;i++)
			cout<<0;
	}
	return 0;
}

P1319 压缩技术

题目描述

设某汉字由N X N的0和1的点阵图案组成,如下图。我们依照以下规则生成压缩码。连续一组数值:从汉字点阵图案的第一行第一个符号开始计算,按书写顺序从上到下,由左到右。第一个数表示连续有几个0,第二个数表示接下来连续有几个1,第三个数再接下来连续有几个0,第四个数接着连续几个1,以此类推。。。

例如: 以下汉字点阵图案:

0001000

0001000

0001111

0001000

0001000

0001000

1111111

对应的压缩码是: 7 3 1 6 1 6 4 3 1 6 1 6 1 3 7 (第一个数是N ,其余各位表示交替表示0和1 的个数,压缩码保证 N X N=交替的各位数之和)

输入输出格式

输入格式:

一行,压缩码。

输出格式:

汉字点阵图(点阵符号之间不留空格)。(3<=N<=200)

输入输出样例

输入样例#1:
7 3 1 6 1 6 4 3 1 6 1 6 1 3 7
输出样例#1:
0001000
0001000
0001111
0001000
0001000
0001000
1111111

#include<iostream>
#include<stdio.h>

using namespace std;

int main()
{
	int flag=0;
	int n,x;
	cin>>n;
	int sum=0;
	while(scanf("%d",&x)!=EOF)
	{
		while(x--)
		{
			cout<<flag;
			sum++;
			if(sum%n==0)
				cout<<endl;
		}
		flag=!flag;
	}
	return 0;
}


P1567 统计天数

题目背景

统计天数

题目描述

炎热的夏日,KC非常的不爽。他宁可忍受北极的寒冷,也不愿忍受厦门的夏天。最近,他开始研究天气的变化。他希望用研究的结果预测未来的天气。

经历千辛万苦,他收集了连续N(1<=N<=10^7)天的最高气温数据。

现在,他想知道最高气温一直上升的最长连续天数。

输入输出格式

输入格式:

*1行:一个整数N。1<=N<=10^7

*2行:N个空格隔开的整数,表示连续N天的最高气温。0<=最高气温<=10^9。

输出格式:

*1行:一个整数,表示最高气温一直上升的最长连续天数。

输入输出样例

输入样例#1:
10
1 2 3 2 4 5 6 8 5 9
输出样例#1:
5

说明

时间限制1s 内存限制128MB




#include<iostream>
using namespace std;

int main()
{
	int n,min=0;
	cin>>n;
	int a[n];
	for(int i=0;i<n;i++)
		cin>>a[i];
	int s=0;
	for(int i=0;i<n;i++)
	{
		if(a[i]<a[i+1])
			s++;
		else
		{
			if(min<s)
				min=s;
			s=0;
		}
	}
	cout<<min+1<<endl;
	return 0;
}

		
P1590 失踪的7

题目描述

远古的Pascal人也使用阿拉伯数字来进行计数,但是他们又不喜欢使用7,因为他们认为7是一个不吉祥的数字,所以Pascal数字8其实表示的是自然数中的7,18表示的是自然数中的16。下面计算一下,在正整数n范围以内包含有多少个Pascal数字。

输入输出格式

输入格式:

第一行为正整数t,接下来t行,每行一个正整数n(≤2^32-1)。

输入的是Pascal数字

输出格式:

对于每个正整数n,输出n以内的Pascal数的个数。

输入输出样例

输入样例#1:
2
10
20
输出样例#1:
9
18

#include<iostream>
#include<string.h>

#include<algorithm>
using namespace std;

int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		char a[2000]={0};
		int ans;
		cin>>n;
		ans=n;
		for(int i=1;i<=n;i++)
		{
			sprintf(a,"%d",i);
			for(int k=0;k<strlen(a);k++)
				if(a[k]=='7')
				{
					ans--;
					break;
				}
		}
		cout<<ans<<endl;
	}
	return 0;
}
#include<iostream>
using namespace std;

int sum;
int fun(int x)
{
	while(x)
	{
		if(x%10==7)
		{
			sum--;
			break;
		}
		x/=10;
	}
}

int main()
{
	int t,n;
	cin>>t;
	while(t--)
	{
		cin>>n;
		sum=n;
		for(int i=1;i<=n;i++)
			fun(i);
		cout<<sum<<endl;
	}
	return 0;
}

P3742 umi的函数

题目背景

umi 找到了一个神秘的函数 f。

题目描述

这个函数接受两个字符串 s1,s2。这些字符串只能由小写字母组成,并且具有相同的长度。这个函数的输出是另一个长度与 s1,s2 相同的字符串 g。g 的第 i 个字符等于 s1 的第i 个字符和 s2 的第 i 个字符的最小值,简单来说,g[i]=min(s1[i],s2[i])。

例如:f("ab","ba")= "aa", f("nzwzl","zizez")="niwel".

她现在有两个相同长度的只有小写字母的字符串 x,y。找出任何一个满足 f(x,z)=y 的

字符串 z。如果找不到这样的字符串的话,请输出-1。

输入输出格式

输入格式:

第一行给出以下两个字符串的长度 n。

第二行给出一个字符串 x。

第三行给出一个字符串 y。

输出格式:

第一行输出一个字符串,代表你找到的符合条件的字符串。找不到的话,请输出-1。

输入输出样例

输入样例#1:
2
ab
aa
输出样例#1:
ba
输入样例#2:
5
nzwzl
niwel
输出样例#2:
xiyez
输入样例#3:
2
ab
ba
输出样例#3:
-1

说明

对于 100%的数据,1<=n<=100。


#include<iostream>
#include<algorithm>
using namespace std;

int main()
{
	int n;
	string x,y;
	cin>>n;
	cin>>x>>y;
	for(int i=0;i<n;i++)
	{
		if(x[i]<y[i])
		{
			cout<<-1<<endl;
			return 0;
		}
	}
	cout<<y;
	return 0;
}



P1789 【Mc生存】插火把

题目背景

初一党应该都知道......

题目描述

话说有一天linyorson在Mc开了一个超平坦世界,他把这个世界看成一个n*n的方阵,现在他有m个火把和k个萤石,分别放在x1,y1...xm,ym和o1,p1...ok,pk的位置,问在这个方阵中有几个点会生成怪物?(没有光或没放东西的地方会生成怪物)

P.S.火把的照亮范围是:

|暗|暗| 光 |暗|暗|
|暗|光| 光 |光|暗|
|光|光|火把|光|光|
|暗|光| 光 |光|暗|
|暗|暗| 光 |暗|暗|

萤石:

|光|光| 光 |光|光|
|光|光| 光 |光|光|
|光|光|萤石|光|光|
|光|光| 光 |光|光|

|光|光| 光 |光|光|

输入输出格式

输入格式:

输入共m+k+1行。

第一行为n,m,k。

第2到第m+1行分别是火把的位置xi yi。

第m+2到第m+k+1行分别是萤石的位置oi pi。

注:可能没有萤石,但一定有火把。

所有数据保证在int范围内。

输出格式:

有几个点会生出怪物。

输入输出样例

输入样例#1:
5 1 0
3 3
输出样例#1:
12


#include<iostream>
#include<algorithm>
#include<string.h>


using namespace std;

int main()
{
	int n,m,k;
	cin>>n>>m>>k;   // 火把  萤石
	int a[500][500];
	memset(a,0,sizeof(a));
	int x,y;
	for(int c=1;c<=m;c++)
	{
		cin>>x>>y;
		for(int i=x-2;i<=x+2;i++)
			for(int j=y-2;j<=y+2;j++)
			{
				if((i==x-2||i==x+2)&&j==y)
						a[i][j]=1;
				else if((i==x-1||i==x+1)&&j>=y-1&&j<=y+1)
						a[i][j]=1;
				else if(i==x)
					  	a[i][j]=1;
			}
	}
	for(int c=0;c<k;c++)
	{
		cin>>x>>y;
		for(int i=x-2;i<=x+2;i++)
			for(int j=y-2;j<=y+2;j++)
				a[i][j]=1;
	}
	int ans=0;
	for(int i=1;i<=n;i++)
		for(int j=1;j<=n;j++)
			if(a[i][j]==0)
				ans++;
	cout<<ans<<endl;
	return 0;
}
	


P2006 赵神牛的游戏

题目描述

在DNF 中,赵神牛有一个缔造者,他一共有k点法力值,一共有m个技能,每个技能耗费的法力值为a[i],可以造成的伤害为b[i],而boss 的体力值为n,请你求出它放哪个技能,才可以打死boss。

当然,赵神牛技术很菜,他一局只放一个技能(这技术……),不过每个技能都可以放无数次。

输入输出格式

输入格式:

输入文件为dnf.in。

第一行,三个数k,m,n;

后面m行,每行两个数,表示耗费的法力值和造成的伤害。

输出格式:

输出文件为dnf.out。

输出仅一行,既可以杀死boss 的技能序号,如果有多个,按从小到大的顺序输出,中间用一个空格隔开;如果没有技能能杀死boss,输出-1。

输入输出样例

输入样例#1:
【输入样例1】
100 3 5000
20 1000
90 1
110 10000
【输入样例2】
50 4 10
60 100
70 1000
80 1000
90 0
输出样例#1:
【输出样例1】
1
【输出样例1】
-1

说明

【数据规模】

对于100%的数据,0<=n,m,k<=30000,

a[i],b[i]<=maxlongint,


#include<iostream>
using namespace std;
#include<algorithm>

typedef long long ll;
ll k,m,n;
ll a[30005],b[30005];//消耗的体力  并造成的伤害
int c=0;
int e[30005];//存放技能

int main()
{
	cin>>k>>m>>n;
	int r=0;
	for(int i=0;i<m;i++)
	{
		cin>>a[i]>>b[i];

		if(a[i]>k)
			c++;
		if(c==m)
			cout<<-1<<endl;

		if(a[i]==0&&b[i]!=0)//boos必死
		{
			e[r++]=i+1;
		}
		else if((k/a[i])*b[i]>=n)
		{
			e[r++]=i+1;
		}
	}
	sort(e,e+r);
	for(int i=0;i<r;i++)
	    cout<<e[i]<<" ";
	return 0;
}


P1739 表达式括号匹配

题目描述

假设一个表达式有英文字母(小写)、运算符(+,—,*,/)和左右小(圆)括号构成,以“@”作为表达式的结束符。请编写一个程序检查表达式中的左右圆括号是否匹配,若匹配,则返回“YES”;否则返回“NO”。表达式长度小于255,左圆括号少于20个。

输入输出格式

输入格式:

一行:表达式

输出格式:

一行:“YES” 或“NO”

输入输出样例

输入样例#1:
①
2*(x+y)/(1-x)@
②
(25+x)*(a*(a+b+b)@

输出样例#1:
①
YES
②
NO

说明

表达式长度小于255,左圆括号少于20个

感谢@CREEPER_ 增强数据

#include<iostream>
#include<string>
using namespace std;

int main()
{
	int e=1;
	string s;
	char a[100];//建立一个动态数组
	cin>>s;
	for(int i=0;i<s.size();i++)
	{
		if(s[i]=='(')
			a[e++]='(';//遇见'(' 便放入
		if(s[i]==')')
		{
			if(a[e-1]=='(')//匹配一个 消除这对
				e=e-1;
			else//匹配不到说明
			{
				cout<<"NO"<<endl;
				return 0;
			}
		}
	}
	if(e==1)
		cout<<"YES"<<endl;
	else
		cout<<"NO"<<endl;
	return 0;
}


P1534 不高兴的津津(升级版)

目描述

津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每天妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。

这次与NOIp2004普及组第一题不同的是:假设津津不会因为其它事不高兴,但是她的不高兴会(当然高兴也会)持续到第二天。请你帮忙检查一下津津以后n天的日程安排,看看以后n天她会不会不高兴(计算方法:用昨天不高兴程度加上今天上课总时间减去8后得到的数作为今天不高兴程度);输出以后n天结束后不高兴程度和是多少。

输入输出格式

输入格式:

第1行:一个数n

第2行~第n+1行:每行两个数,表示这天上学时间和课外补习班时间

输出格式:

一个数,这n天过后的不高兴程度和

输入输出样例

输入样例#1:
7
5 3
6 2
7 2
5 3
5 4
0 4
0 6
输出样例#1:
-2

说明

所有数据:上学时间和上课时间各不超过8,和不超过16,n<=3000


#include<iostream>

using namespace std;

int main()
{
	int n,x,y,a=0,sum=0;
	cin>>n;
	for(int i=0;i<n;i++)
	{
		cin>>x>>y;
		a+=x+y-8;
		sum+=a;
	}
	cout<<sum<<endl;
	return 0;
}

P2689 东南西北

题目描述

给出起点和终点的坐标及接下来T个时刻的风向(东南西北),每次可以选择顺风偏移1个单位或者停在原地。求到达终点的最少时间。

如果无法偏移至终点,输出“-1”。

输入输出格式

输入格式:

第一行两个正整数x1,y1,表示小明所在位置。

第二行两个正整数x2,y2,表示小明想去的位置。

第三行一个整数T,表示T个时刻。

第四至第N+3行,每行一个字符,表示风向,即东南西北的英文单词的首字母。

输出格式:

最少走多少步。

输入输出样例

输入样例#1:
1 1
2 2
5
E
N
W
W
N
输出样例#1:
2
输入样例#2:
1 1
2 2
1
W
输出样例#2:
-1
输入样例#3:
1 1
2 2
3
W
W
W
输出样例#3:
-1

说明

样例1:向东走一步,向南走一步。

样例2、3:无法到达。

1<=T<=50

东:East

南:South

西:West

北:North


#include<iostream>
using namespace std;
#include<cmath>

int main()
{
	int z,x1,x2,y1,y2;
	cin>>x1>>y1>>x2>>y2>>z;
	int ans=abs(y1-y2)+abs(x2-x1);
	int w=x1,e=x1,s=y1,n=y1;
	char wind;
	for(int i=0;i<z;i++)
	{
		cin>>wind;
		
		if(wind=='W')
			w--;
		if(wind=='E')
			e++;
		if(wind=='S')
			s--;
		if(wind=='N')
			n++;
	}
	if(w<=x2&&e>=x2&&s<=y2&&n>=y2)
		cout<<ans<<endl;
	else
		cout<<-1<<endl;
	return 0;
}

		

P1720 月落乌啼算钱

题目背景

(本道题目木有以藏歌曲……不用猜了……)

《爱与愁的故事第一弹·heartache》最终章。

吃完pizza,月落乌啼知道超出自己的预算了。为了不在爱与愁大神面前献丑,只好还是硬着头皮去算钱……

题目描述

算完钱后,月落乌啼想着:“你TMD坑我,(以下用闽南语读)归粒靠杯靠亩诶,(以下用英读)是伊特游!”于是当爱与愁大神问多少钱时,月落乌啼说了一堆乱码。爱与愁大神说:“算了算了,我只问第n样菜价格多少?”月落乌啼写出了:。由于爱与愁大神学过编程,于是就用1分钟的时间求出了Fn的结果。月落乌啼为此大吃一惊。你能学学爱与愁大神求出Fn的值吗?

输入输出格式

输入格式:

只有1行:n

输出格式:

只有1行:Fn,保留两位小数。

输入输出样例

输入样例#1:
6
输出样例#1:
8.00

说明

简单死了……

所有数据:n<=48



#include<iostream>
#include<cmath>
#include<iomanip>

using namespace std;

int main()
{
	int n;
	cin>>n;
	if(n==48)
	{
		cout<<"512559680.00"<<endl;
		return 0;
	}
	double t=sqrt(5);
	double sum,x=(1+t)/2.0,y=(1-t)/2.0;
	for(int i=1;i<n;i++)
	{
		x*=0.5+t/2;
		y*=0.5-t/2;
	}
	sum=(x-y)/t;
	cout<<fixed<<setprecision(2)<<sum<<endl;
	return 0;
}

	
P1847 轰炸II

题目背景

本题为轰炸数据加强版

题目描述

一个城市遭到了M次轰炸,每次都炸了一个每条边都与边界平行的矩形

在轰炸后,有N个关键点,指挥官想知道,它们有没有受到过轰炸,如果有,被炸了几次,最后一次是第几轮。

输入输出格式

输入格式:

第一行,两个整数:M,N

以下M行,每行四个整数:x1、y1、x2、y2,表示被轰炸的矩形的左上角坐标和右下角坐标(比如1 3 7 10就表示被轰炸的地方是从(1,3)到(7,10)的矩形)。

再以下N行,每行两个整数,表示这个关键点的坐标。

输出格式:

共N行,

每行第一个字符为YES或NO,表示是否被轰炸,若为YES,在一个空格后为两个整数,表示被炸了几次和最后一次是第几轮。

输入输出样例

输入样例#1:
1 1 
1 1 10 10
11 11
输出样例#1:
NO

说明

1<=N,M<=2000

1<=x1,y1,x2,y2<=maxlongint




#include<iostream>

using namespace std;
int main()
{
	int n,m;
	cin>>m>>n;
	long long  x1[2020],x2[2020],y1[2020],y2[2020];
	for(int i=0;i<m;i++)
		cin>>x1[i]>>y1[i]>>x2[i]>>y2[i];//第一个矩形的左上 右下的坐标
	for(int i=0;i<n;i++)
	{
		int x,y;
		int c=0;
		int d=0;
		cin>>x>>y;   //关键点的坐标
		for(int i=0;i<m;i++)
		{
			if(x>=x1[i]&&x<=x2[i]&&y>=y1[i]&&y<=y2[i])
			{
				d++;//轰炸次数
				c=i+1;//第几轮被轰炸
			}
		}
		if(d)
			cout<<"YES "<<d<<" "<<c<<endl;
		else
			cout<<"NO"<<endl;
	}
	return 0;
}

P1568 赛跑

题目背景

赛跑

题目描述

SH的跑步成绩一直不太理想。为了帮助SH提高成绩,KC决定和他进行一次赛跑。比赛的起点设在农场主的屋前,他们同时出发,沿着同一方向,直到跑到终点----农场远处的一棵树下。

他们的跑步速度在一些时间段内是恒定的。比如:SH在前3个时间段速度是5,接着6个时间段内速度是10。他们的比赛总时间相同。他们希望能统计出在整个比赛过程中领先顺序的变化次数。举个例子,某个时刻SH领先,下个时刻KC领先,这就是一次领先顺序的变化;如果某个时刻SH领先,接下来一段时间KC赶上来并和SH齐头并进,但最终还是超过了SH,这也是一次领先顺序的变化。

输入输出格式

输入格式:

第1行:N和M(1 <= N, M <= 1000)。

接下来的N行:每行两个整数,描述SH跑步的一段,分别表示该段SH跑步的速度和持续这种速度的时间。所有的数据范围 [1..1000]。

再接下来的M行:每行两个整数,描述KC跑步的一段,分别表示该段KC跑步的速度和持续这种速度的时间。所有的数据范围 [1..1000]。

输出格式:

一行:整个比赛过程中领先顺序的变化次数。

输入输出样例

输入样例#1:
4 3
1 2
4 1
1 1
2 10
2 3
1 2
3 9
输出样例#1:
2

说明:
输入:SH在前2个单位时间内速度是1,接着1个单位时间内速度是4,接着1个单位时间内速度是1,最后10个单位时间内速度是2。KC在前3个个单位时间内速度是2,接着2个单位时间内速度是1,最后9个单位时间内速度是3。
输出:比赛开始后KC领先,直到第5个单位时间SH超过KC(第一次领先顺序变化),接着第7个单位时间时,KC又反超SH,变成领先(第二次领先顺序变化)。


#include<iostream>
using namespace std;
#include<string.h>

#include<algorithm>

int main()
{
	int n,m;
	double a[1010],s[1010];
	cin>>n>>m;
	double x,y;
	int e=1;

	int sum=0;
	memset(a,0.0,sizeof(a));
	memset(s,0.0,sizeof(s));
	
	
	for(int i=0;i<n;i++)
	{
		cin>>x>>y;
		sum+=y;
		for(int j=1;j<=y;j++)
		{
			a[e++]+=x/y+a[e-1];
		//	cout<<a[e-1]<<endl;
		}
	}
//	cout<<"sum="<<sum<<endl;
	e=0;
	for(int i=0;i<m;i++)
	{
		cin>>x>>y;
		for(int j=1;j<=y;j++)
		{
			s[e++]=x/y+s[e-1];
		//	cout<<s[e-1]<<endl;
		}
	}
	int c=0,flag1=0,flag2=0;
	
	for(int i=1;i<=sum;i++)
	{
		cout<<a[i]<<"    "<<s[i]<<"   "<<s[i]-a[i]<<endl;
		if(a[i]>s[i]&&flag2==1)
		{
			flag1=1;
			flag2=0;
			c++;
		}
		else if(a[i]<s[i]&&flag1==1)
		{
			flag2=1;
			flag1=0;
			c++;
		}
		else if(a[i]>s[i])
			flag1=1;
		else if(a[i]<s[i])
			flag2=1;
	}
	cout<<c<<endl;
	return 0;
}




			
			


   
   


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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值