CPPU洛谷题整理(1)

东南西北



题目描述

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

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

输入格式

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

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

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

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

输出格式

最少走多少步。

说明/提示

样例:向东走一步,向北走一步为:
1 1 -> 2 2

1<=T<=50
东:East
南:South
西:West
北:North

我的解答

#include<iostream>
using namespace std;
struct ad
{
	int x;
	int y;
}ad1,ad2;

int main()
{
	int T,i,step=0;char t[50];
	cin>>ad1.x>>ad1.y;
	cin>>ad2.x>>ad2.y;	
	cin>>T;
	for(i=0;i<T;i++)cin>>t[i];
	for(i=0;i<T;i++)
	{

		if(t[i]=='E'&&ad1.x<ad2.x){ad1.x++;step++;}
		else if(t[i]=='W'&&ad1.x>ad2.x){ad1.x--;step++;}
		else if(t[i]=='N'&&ad1.y<ad2.y){ad1.y++;step++;}
		else if(t[i]=='S'&&ad1.y>ad2.y){ad1.y--;step++;}
		if(ad1.x==ad2.x&&ad1.y==ad2.y)break;
	}	
	if(ad1.x!=ad2.x||ad1.y!=ad2.y)cout<<-1;
	else cout<<step;
	return 0;
  } 

珠心算测验



题目描述

珠心算是一种通过在脑中模拟算盘变化来完成快速运算的一种计算技术。珠心算训练,既能够开发智力,又能够为日常生活带来很多便利,因而在很多学校得到普及。

某学校的珠心算老师采用一种快速考察珠心算加法能力的测验方法。他随机生成一个正整数集合,集合中的数各不相同,然后要求学生回答:其中有多少个数,恰好等于集合中另外两个(不同的)数之和?

最近老师出了一些测验题,请你帮忙求出答案。

(本题目为2014NOIP普及T1)

输入格式

共两行,第一行包含一个整数nn,表示测试题中给出的正整数个数。

第二行有nn个正整数,每两个正整数之间用一个空格隔开,表示测试题中给出的正整数。

输出格式

一个整数,表示测验题答案。

说明/提示

【样例说明】

  • 由1+2=3,1+3=41+2=3,1+3=4,故满足测试要求的答案为22。
  • 注意,加数和被加数必须是集合中的两个不同的数。

【数据说明】

  • 对于100%100%的数据,3 ≤ n ≤ 1003≤n≤100,测验题给出的正整数大小不超过10,00010,000。

我的解答

#include<iostream>
using namespace std;
int main()
{
   int n,i,j,k,e=0,max,min,m;
   int a[100],b[100]={0};
   cin>>n;
   for(i=0;i<n;i++)
   	cin>>a[i];
   for(i=0;i<n-2;i++)
   	for(j=i+1;j<n-1;j++)
   		for(k=j+1;k<n;k++)
   		{	

   			if(a[i]+a[j]==a[k]&&b[k]==0)
   			{
   				b[k]=1;e++;//cout<<"ak="<<a[k]<<endl;
   			}
   			else
   			{
   				max=(a[i]>a[j])?i:j;
   				min=(a[i]<a[j])?i:j;
   			if(a[max]-a[min]==a[k]&&b[max]==0)
   			{	
   				b[max]=1;e++;//cout<<"at="<<a[max]<<endl;
   			}}
   		}
   cout<<e;
   
   return 0;
}

梦中的统计



题目背景

Bessie 处于半梦半醒的状态。过了一会儿,她意识到她在数数,不能入睡。

题目描述

Bessie的大脑反应灵敏,仿佛真实地看到了她数过的一个又一个数。她开始注意每一个数码(0 \ldots 90…9):每一个数码在计数的过程中出现过多少次?

给出两个整数 MM 和 NN \((1 \leq M \leq N \leq 2 \times 10^91≤M≤N≤2×10 9\)
以及 \((N-M \leq 5 \times 10^5N−M≤5×10 5)\),求每一个数码出现了多少次。

输入格式

第 11 行: 两个用空格分开的整数 MM 和 NN。

输出格式

第 11 行: 十个用空格分开的整数,分别表示数码 0 \ldots 90…9 在序列中出现的次数

我的解答

#include<iostream>
using namespace std;
int main()
{
	int M,N,j,k[10]={0};
	cin>>M>>N;
	for(;M<=N;M++)
		for(j=M;j;j/=10)
			k[j%10]++;
	for(j=0;j<10;j++)
	cout<<k[j]<<" ";
	return 0;
} 

旗鼓相当的对手



题目描述

现有 N(N\le 1000)N(N≤1000) 名同学参加了期末考试,并且获得了每名同学的信息:语文、数学、英语成绩(均为不超过 150 的自然数)。如果某对学生 <i,j> 的每一科成绩的分差都不大于 5,且总分分差不大于 10,那么这对学生就是“旗鼓相当的对手”。现在想知道这些同学中,有几对“旗鼓相当的对手”?同样一个人可能会和其他好几名同学结对。

输入格式

第一行一个正整数 NN。

接下来 NN 行,每行三个整数,其中第 ii 行表示第 ii 名同学的语文、数学、英语成绩。最先读入的同学编号为 1。

输出格式

输出一个个整数,表示“旗鼓相当的对手”的对数。

我的解答

#include<iostream>
#include<cmath>
using namespace std;
struct stu
{
	int Ch;
	int math;
	int En;
}s[1010];

int main()
{
	int N,i,j,sum[i],dui=0;
	cin>>N;
	
	for(i=0;i<N;i++)
		{
			cin>>s[i].Ch>>s[i].En>>s[i].math;
			sum[i]=s[i].Ch+s[i].En+s[i].math;
		}
	
	for(i=0;i<N;i++)
		for(j=i+1;j<N;j++)
	{
		if(abs(s[i].Ch-s[j].Ch)<=5
		&&abs(s[i].math-s[j].math)<=5
		&&abs(s[i].En-s[j].En)<=5
		&&abs(sum[i]-sum[j])<=10)
		dui++;
	}
	cout<<dui;
	return 0;
 }
posted @ 2020-11-28 22:02  菜鸟侦探乐  阅读(607)  评论(0)    收藏  举报