luogu 基础题

来源:互联网 发布:ubuntu grub 命令 编辑:程序博客网 时间:2024/06/07 00:16

P1116 车厢重组

题目描述

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

输入输出格式

输入格式:

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

输出格式:

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

输入输出样例

输入样例#1:
44 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:
45 0 5 0
输出样例#1:
0
输入样例#2:
115 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++;elsey++;}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:
0001000000100000011110001000000100000010001111111

#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:
101 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:
21020
输出样例#1:
918

#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:
2abaa
输出样例#1:
ba
输入样例#2:
5nzwzlniwel
输出样例#2:
xiyez
输入样例#3:
2abba
输出样例#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 03 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 500020 100090 1110 10000【输入样例2】50 4 1060 10070 100080 100090 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;elsecout<<"NO"<<endl;return 0;}


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

目描述

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

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

输入输出格式

输入格式:

第1行:一个数n

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

输出格式:

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

输入输出样例

输入样例#1:
75 36 27 25 35 40 40 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 12 25ENWWN
输出样例#1:
2
输入样例#2:
1 12 21W
输出样例#2:
-1
输入样例#3:
1 12 23WWW
输出样例#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;elsecout<<-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 1011 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;elsecout<<"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 31 24 11 12 102 31 23 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;}


   
   


原创粉丝点击