1. 程式人生 > >2018清北學堂普及組衝刺班6連考總結反思wn編輯器

2018清北學堂普及組衝刺班6連考總結反思wn編輯器

DAY 1 Problem 1 A(A.cpp/c/pas) 【題目描述】 給出一個n*m的網格,其中小明初始站在(x,y)這個位置,網格內無障礙,小明可以向上下左右四個方向一步走一格,問小明最少走幾步可以走出網格。 【輸入格式】 輸入檔案A .in 第一行四個整數n,m,x,y。 【輸出格式】 輸出檔案A.out 一行一個整數表示答案。 【樣例輸入】 3 3 2 2 【樣例輸出】 2 【資料範圍】 對於 30% 資料 n,m<=3 對於 50% 資料 n,m<=1000 對於 100% 資料 n,m<=1000000000,1<=x<=n,1<=y<=m;

想法很簡單的一道題目,但是我想多了,廣搜也會超時呀!!!

原始碼

#include <bits/stdc++.h>
using namespace std;

int dx[5]={0,0,-1,0,1};        
int dy[5]={0,-1,0,1,0};

struct node
{
	long x;
	long y;
	long ans;
}p,q;

long start_x,start_y,n,m;

int main()
{
	freopen("A.in","r",stdin);
	freopen("A.out","w",stdout);
	
	cin>>n>>m>>start_x>>start_y;
	
	if (start_x < 1 || start_y < 1 || start_x > n || start_y > m)
		{
			cout<<0;
			
			return 0;
		}

	queue <node> line;
	p.x = start_x;
	p.y = start_y;
	p.ans = 0;
	line.push(p);
	
	while (!line.empty())
		{
			p = line.front();
			
		//	if (p.x == n && p.y == m)
		//		{
		//			cout<<p.ans;
					
		//			break;
		//		}
			
			p.ans++;
			
			for (int i = 1; i <= 4; i++)
				{
					q = p;
					int xx = p.x + dx[i];
					int yy = p.y + dy[i];
					q.x = xx;
					q.y = yy;
					
					if (xx < 1 || xx > n || yy < 1 || yy > m) 
						{
							cout<<p.ans<<endl;
							
							return 0;
						}
					
					line.push(q);
				}
		
			line.pop();
		}
}
//50分qoq

我還是搜尋寫上頭了QAQ std

#include <bits/stdc++.h>
using namespace std;

int n,m,x,y,ans1,ans2; 

int main()
{
	cin>>n>>m>>x>>y;
	//我也想到直接判斷直線距離了呀   哎。。。可惜
	ans1 = min(x,abs(x-n));
	ans2 = min(y,abs(y-m));
	
	cout<<min(ans1,ans2)+1;
	
	return 0;
}
//當時只想裝一下b,然後就沒有然後了

反思:要注意審題,對合適的題型使用合適的演算法,不要再犯這樣坑爹的低階錯誤了

Problem 2 B(B.cpp/c/pas) 【題目描述】 Lucy家門前的大街上有n家店,lucy是一個喜歡收藏機械鍵盤的女孩子,這n家店中第i家店賣的鍵盤價格為V[i],lucy前前後後有q天心血來潮買電腦,其中第i次買電腦的預算是K[i],問每一次有多少店的鍵盤能供lucy選擇,能選擇當且僅當該店的鍵盤價格小於等於lucy的預算。 【輸入格式】 輸入檔案B.in。 輸入檔案第一行兩個整數n,q。 接下來一行n個整數,其中第i個整數為V[i]。 第q行每行一個整數K代表該次買電腦的預算。 【輸出格式】 輸出檔案B.out。 輸出檔案q行,第i行表示第i次買電腦,能有多少家店可供選擇。 【樣例輸入】 6 3 6 5 4 3 2 1 1 3 5 【樣例輸出】 1 3 5 【資料範圍】 對於30%的資料,n,q<=1000。 對於另外30%的資料,n,q<=100000,0<=V[i],K[i]<=100000 對於100%的資料, n<=100000,m<=100000,0<=V[i],K[i]<=10^9。

想法自己上來就寫了,沒看清資料範圍QAQ(看清了也寫不來 ) 這題是二分呀!!!

原始碼

#include <bits/stdc++.h>
using namespace std;

long a[100009],n,q,k,b[100009];
long total;

int main()
{
	freopen("B.in","r",stdin);
	freopen("B.out","w",stdout);
	
	cin>>n>>q;
	if (n == 0) 
		{
			for (int i = 1; i <= q; i++)
				cout<<0<<endl;
				
			return 0;
		}
		
	for (int i = 1; i <= n; i++)
		cin>>a[i];
		
	sort(a+1,a+n+1);
		
	for (int i = 1; i <= q; i++)
		cin>>b[i];
		
	for (int i = 1; i <= q; i++)
		{
			total = 0;
			
			for (int j = 1; j <= n; j++)
				if (b[i] >= a[j]) total++;
					else
						break;
			
			cout<<total<<endl;	
		}	
	return 0;
}
//30分(樓下風景不錯,馬上下去,快上天台了)

std

#include <bits/stdc++.h>
using namespace std;

int n,q,k;
int a[100009];

int main()
{
	cin>>n>>q;
	
	for (int i = 1; i <= n; i++)
		cin>>a[i];
		
	sort(a+1,a+n+1);
	
	for (int i = 1; i <= q; i++)
		{
			cin>>k;
			
			int p = upper_bound(a+1,a+n+1,k)-a;     //二分函式,找到大於的返回
			
			cout<<k<<endl;
		}
		
	return 0;
}

反思:要注意看範圍 要注意看範圍 要注意看範圍(重要的事情說3遍),要加強對二分的練習