1. 程式人生 > 其它 >POJ_3061 JAVA 尺取法

POJ_3061 JAVA 尺取法

技術標籤:學習報告佇列queue

第二週學習內容

一.棧,佇列,Stacks,Queues

(一)棧
棧是一種運算受限的線性表。限定僅在表尾進行插入和刪除操作的線性表。元素遵循先進後出的原則。

#include <iostream>
using namespace std;
const int N=110;
int st[N];
int bottom=0,top=-1;
int n;
int main()
{
	cin>>n;
	while(n--)
	{
		cin>>
st[++top]; } while(top>=bottom) { cout<<st[top--]<<" "; } return 0; }

在這裡插入圖片描述

(二)佇列
佇列是一種特殊的線性表,特殊之處在於它只允許在表的前端(front)進行刪除操作,而在表的後端(rear)進行插入操作,和棧一樣,佇列是一種操作受限制的線性表。進行插入操作的端稱為隊尾,進行刪除操作的端稱為隊頭。元素遵循先進先出的原則。

#include <iostream>
using namespace std;
const int N=110;
int st[N]
; int front=0,rear=-1; int n; int main() { cin>>n; while(n--) { cin>>st[++rear]; } while(rear>=front) { cout<<st[front++]<<" "; } return 0; }

在這裡插入圖片描述

(三)Stacks
1.empty() 堆疊為空則返回真
2.pop() 移除棧頂元素
3.push() 在棧頂增加元素
4.size() 返回棧中元素數目
5.top() 返回棧頂元素
(四)Queue
1.back() 返回最後一個元素

2.empty() 如果佇列空則返回真
3.front() 返回第一個元素
4.pop() 刪除第一個元素
5.push() 在末尾加入一個元素
6.size()返回佇列中元素的個數

二.二分

1.整數二分

整數二分有兩個模板:
(1)分為[l,mid] [mid+1,r] 此時的程式碼為:

#include <iostream>
using namespace std;
int main()
{
	int l=0,r=9,mid,a[101],x;
	cin>>x;
	for(int i=1;i<=r;i++)
	{
		cin>>a[i];
	}
	while(l<r)
	{
		mid=(l+r)/2;
		if(x<=a[mid])
		{
			r=mid;
		}
		else
		{
			l=mid+1;
		}
	}
	cout<<r<<endl;
	return 0;
}

在這裡插入圖片描述
2.分為[l,mid-1] [mid.r]此時程式碼為:

#include <iostream>
using namespace std;
int main()
{
	int l=0,r=9,mid,a[101],x;
	cin>>x;
	for(int i=1;i<=r;i++)
	{
		cin>>a[i];
	}
	while(l<r)
	{
		mid=(l+r+1)/2;//為了防止程式陷入死迴圈 
		if(x>=a[mid])
		{
			l=mid;
		}
		else
		{
			r=mid-1;
		}
	}
	cout<<l<<endl;
	return 0;
}

在這裡插入圖片描述

2.小數二分

小數二分與整數二分的差別在於while迴圈的限制條件不同,實數要用一個特別小的數來表示兩者接近,例如1e-8;

三.字首與差分

(1)一維字首和
S[i] = a[1] + a[2] + … a[i]
a[l] + … + a[r] = S[r] - S[l - 1]
(2)二維字首和
S[i, j] = 第i行j列格子左上部分所有元素的和以(x1, y1)為左上角,(x2,y2)為右下角的子矩陣的和為 S[x2, y2] - S[x1 - 1, y2] - S[x2, y1 - 1] + S[x1- 1, y1 - 1]
(3)一維差分
B[i] = a[i] -a[i-1]給區間[l,r]中的每個數加上c:B[l] += c, B[r + 1] -= c
(4)二維差分
給以(x1, y1)為左上角,(x2,y2)為右下角的子矩陣中的所有元素加上c: S[x1, y1] += c, S[x2 + 1, y1] -= c, S[x1, y2 + 1] -= c, S[x2 + 1, y2 + 1] += c

四.位運算

四個運算子
與&,只有x,y都是1的時候,運算結果才是1.其餘情況都是0。1&1 = 1,
1&0 = 0;
或|,x,y中只要有一個是1,結果就是1,其餘情況0,1|0=1, 0|0=0;
非!, 如果x是0,!x= 1,x是1的話,運算結果是0;
異或^ ,x^y相同是0,不同是1,1 ^ 1 = 0 ,0 ^ 0 = 0, 0 ^ 1 =0;
整型:有符號整型和無符號整型
int 32位二進位制
有符號整型:正數: 0負數:1
1:0000000000…01
-1:1000000000…01

100000…111
反碼: 011111… 000
補碼: 1:如果是正數:正數的補碼就等 於原碼。100000…111
2:如果是負數:負數的補碼就是在反碼的基礎上加1: 011111… 000 +1=011111… 001
左移: 1<<x 01 10 100 1 2 4 相當於擴大2的倍數。
右移: 1>>x 100 10 01 4 2 1 相當於除以2。