HL第一次考试

对于第一次考试,老师说去虐一虐初一的,看看题目,竟然有几题做过,然后就飘了…,有大佬AK了,我却20几名,连几个初一的都比不过…


回到正文
##第一题
给定三个坐标,输出第四个坐标,使这四个坐标连成一个矩形

很水的一道题,找出三个坐标中和其他两个不同的x坐标和y坐标就行了

#include<bits/stdc++.h>
using namespace std;
int main()
{
	int x1,x2,y1,y2,x3,y3;
	cin>>x1>>y1>>x2>>y2>>x3>>y3;
	cout<<(x1^x2^x3)<<' '<<(y1^y2^y3);
	return 0; 
}

位运算大法好

##第二题
蜗牛爬井,白天上爬x,晚上下落y

我们数学老师说的,就是小学一年级数学题…
强模拟也行

#include<bits/stdc++.h>
using namespace std;
int a,b,v;
int ans=0;
int main()
{
	cin>>a>>b>>v;
	if ((v-a)%(a-b)==0)
	  cout<<(v-a)/(a-b)+1;
	else
	  cout<<(v-a)/(a-b)+2;
	return 0;
}

十分简单,
##第三题
**从n个数中找出偶数的个数以及它们的和 **

题目=题解

#include<bits/stdc++.h>
using namespace std;
int n;
int sum=0,num=0;
int x;
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
	  {
	  	cin>>x;
	  	if (x%2==0)
	  	  sum+=x,num++;
	  }
	cout<<num<<' '<<sum<<endl;
	return 0;
}

##第四题

找到一串数中最大值和次大值,以及它们的位置

用结构体存储一下数值和位置,再用sort从大到小排序,输出第一和第二个

#include<bits/stdc++.h>
using namespace std;
struct big
{
	int x,y;
}a[110];
int n;
bool mycmp(big a,big b)
{
	return (a.x>b.x);
}
int main()
{
	cin>>n;
	for (int i=1;i<=n;i++)
	  cin>>a[i].x,a[i].y=i;
	sort(a+1,a+n+1,mycmp);
	cout<<a[1].x<<' '<<a[1].y<<endl<<a[2].x<<' '<<a[2].y;
	return 0;
}

##第五题
描述有点长:给你只有’.‘和’X’组成的地图,’.'为海洋,'X’为陆地,边界为海洋,被海洋三面或四面包围的陆地几天后会被淹没,输出几天后包含所有陆地的最小矩形

先模拟一遍,把陆地转化为海洋,再从四个方向逐渐压缩,记录上下左右四条边的值,输出这个矩形

#include<bits/stdc++.h>
using namespace std;
char a[20][20]={};
int n,m;
int up=1,down,rightt,leftt=1;
bool cover(int i,int j)//四个方向判断是否被三面包围
{
	int n=0;
	if (a[i-1][j]=='.')
	  n++;
	if (a[i+1][j]=='.')
	  n++;
	if (a[i][j+1]=='.')
	  n++;
	if (a[i][j-1]=='.')
	  n++;
	if (n>=3)
	  return true;
	else
	  return false;
}
bool empty(bool p,int x)//判断这条直线是否都是海洋
{
	bool k=true;
	if (p)//判断的直线是行
	  {
	  	for (int i=1;i<=m;i++)
	  	  if (a[x][i]=='X')//是陆地
	  	    k=false;
	  }
	else//判断的直线是列
	  {
	  	for (int i=1;i<=n;i++)
	  	  if (a[i][x]=='X')
	  	    k=false;
	  }
	if (k)
	  return true;//可以推进
	else
	  return false;//不能推进
}
int main()
{
	cin>>n>>m;
	down=n;
	rightt=m;
	for (int i=1;i<=n;i++)
	  for (int j=1;j<=m;j++)
	    cin>>a[i][j];
	for (int i=1;i<=n;i++)//边缘为海洋,有点繁琐
	  a[i][0]='.';
	for (int i=1;i<=m;i++)
	  a[0][i]='.';
	for (int i=1;i<=n;i++)
	  a[i][m+1]='.';
	for (int i=1;i<=m;i++)
	  a[n+1][i]='.';
	for (int i=1;i<=n;i++)
	  for (int j=1;j<=m;j++)
	    if (a[i][j]=='X')
	      if (cover(i,j))//将三面环海的陆地淹没
	        a[i][j]='!';//它在那时不是真正的海洋,所以要用其他字符
	while (empty(1,up))//从上往下压缩
	  up++;
	while (empty(1,down))//从下往上压缩
	  down--;
	while (empty(0,leftt))//从右往左压缩
	  leftt++;
	while (empty(0,rightt))//从左往右压缩
	  rightt--;
	for (int i=1;i<=n;i++)
	  for (int j=1;j<=m;j++)
	    if (a[i][j]=='!')//是即将要被淹没的陆地
	      a[i][j]='.';//成为海洋
	for (int i=up;i<=down;i++)//输出矩形
	  {
	  	for (int j=leftt;j<=rightt;j++)
	  	  cout<<a[i][j];
	  	cout<<endl;
	  }
	return 0;
}

正文结束


总的来说,错的还是一些小错误,比如运算符优先级错误等等,数学方法还是挺有用的,能缩短很多时间复杂度
结束

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值