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;
}

正文結束


總的來說,錯的還是一些小錯誤,比如運算符優先級錯誤等等,數學方法還是挺有用的,能縮短很多時間複雜度
結束

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章