c++/java笔记

wyh15 Minecraft 2024-04-20 16:44:36 2024-07-26 15:55:26 31

c++/java个人笔记


嗨!我是qp,这是我的c++/java神器,个人笔记是我的秘密武器,写题5分钟,休息2小时,不要告诉别人哟(he~he~)

头文件

万能头文件(比较建议用这个)

#include<bits/stdc++.h>

字符串头文件

#include<string.h>

系统头文件

#include<windows.h>

普通头文件

#include <iostream>

基本框架

#include<bits/stdc++.h>
using namespace std;
int main(){

    return 0;
}
import java.io.*;
import java.util.*;

public class Main {
    public static void main(String args[]) throws Exception {
        
    }
}

变量

整形

c++:

int,long long,stort

java:

var,int,long var,short var

浮点

double,float

oj提交代码注意事项:

Liusers oj 不是用的windows,所以不要用windows.h

hello word:

c++:

#include<bits/stdc++.h>
using namespace std;
int main(){
    cout<<"hello word!";
    return 0;
}

java:

import java.io.*;
import java.util.*;

public class Main {
    public static void main(String args[]) throws Exception {
        System.out.println("Hello World");
    }
}

c++算法:

二分查找模板

#include<bits/stdc++.h>
using namespace std;
int main(){
    int L = 1,R = 100,mid,num,cnt = 0;//L表示左边,R表示右边的最大值
    cin>>num;
    while(L<=R){
        mid = (L+R)/2;
        cnt++;//二分找中间值
        if(mid==num){
            break;
        }
        else if(mid>num){
            R = mid - 1;
        }
        else L = mid + 1;
    }
    cout<<cnt;
    return 0;
}

试一下吧:

https://tctm.cpolar.cn/problem/229

二分答案模板

#include<bits/stdc++.h>
using namespace std;
const int N = 5e6+10;
long long a[N],n,x,l = 1,r,mid;
bool check(int m){
    return a[m]<=x;
}
int main(){
	cin>>n;
    for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
    }
    cin>>x;
    r = n;
    while(l<r){
        mid = (l+r+1)/2;
        if(check(mid)){
            l=mid;
        }else{
            r=mid-1;
        }
    }
    if(a[l]==x){
        cout<<l<<endl;
    }else{
        cout<<"-1"<<endl;
    }
	return 0;
}

深搜模板

#include<bits/stdc++.h>
using namespace std;
int vis[4][4],cnt = 0;
int dx[4] = {1,0,-1,0};//x的下右上左的变化值 
int dy[4] = {0,1,0,-1};//y的下右上左的变化值 
void dfs(int x,int y){ //(2,2) 
	//搜索出口
	if(cnt==9){
		cout<<x<<' '<<y;
		return;
	} 
	for(int i=0;i<4;i++){//开始四个方向的搜索
		int nx = x+dx[i]; //3 
		int ny = y+dy[i]; //2  nx,ny (3,2) 
		//判断当前点是否在搜索范围内,并且没有被搜索过
		if(nx>0 &&nx<=3 &&ny>0 &&ny<=3 && vis[nx][ny]==0){
			vis[nx][ny] = 1;//马上标记该点 
			cnt++;
			dfs(nx,ny); //下面进行深度优先搜索 
		} 
	}
} 
int main(){
	vis[1][2] = 1;
	cnt++;
	dfs(1,2);
	return 0;
}

试一下吧:

https://tctm.cpolar.cn/problem/6153

深搜模板2

#include<bits/stdc++.h>
using namespace std;
//1.创建标记数组vis(4行4列) 
int vis[4][4]; 
//2.定义x方向数组(4个方向)
int dx[4] = {1,0,-1,0};//下右上左 
int dy[4] = {0,1,0,-1};
//3.定义y方向数组
//4.定义dfs搜索函数
void dfs(int x,int y){
	
	for(int i=0;i<4;i++){
		int nx = x+dx[i];
		int ny = y+dy[i];
		if(nx>0&&nx<=3 &&ny>0&&ny<=3 && vis[nx][ny]==0){
			vis[nx][ny]=1;
			dfs(nx,ny);
		}
	}
}

int main(){
	//对起点(1,1)进行标记
	vis[1][1] = 1;
	//从起点(1,1)开始搜索 
	dfs(1,1);
	return 0;
}

字典树模板

(Hello word作为模板来写的)

#include <iostream>
using namespace std;

struct TrieNode {
    TrieNode* children[26];
    bool isEndOfWord;
};

TrieNode* getNode() {
    TrieNode* node = new TrieNode;
    for (int i = 0; i < 26; i++) {
        node->children[i] = nullptr;
    }
    node->isEndOfWord = false;
    return node;
}

void insertWord(TrieNode* root, string word) {
    TrieNode* current = root;
    for (char c : word) {
        int index = c - 'a';
        if (current->children[index] == nullptr) {
            current->children[index] = getNode();
        }
        current = current->children[index];
    }
    current->isEndOfWord = true;
}

void printTrie(TrieNode* root) {
    if (root->isEndOfWord) {
        cout << "Hello World" << endl;
        return;
    }
    for (int i = 0; i < 26; i++) {
        if (root->children[i] != nullptr) {
            printTrie(root->children[i]);
        }
    }
}

int main() {
    TrieNode* root = getNode();
    insertWord(root, "helloworld");
    printTrie(root);
    return 0;
}

贪心算法(难点)

#include<bits/stdc++.h>
using namespace std;
struct goods{
	int p,n1,d;
};
bool cmp(goods x,goods y){
	return x.d>y.d;
}
int main(){
	int n,l;
    cin>>n>>l;
	goods a[101];
	for(int i=0;i<n;i++){
        cin>>a[i].p>>a[i].n1;
		a[i].d =a[i].p/a[i].n1;
	}
	sort(a,a+n,cmp);
	int sum=0;
	for(int i=0;i<n;i++){
		if(a[i].n1<=l){
			sum = sum + a[i].p;
			l = l - a[i].n1;
		}
		else{
			sum = sum + a[i].d*l;
            break;
		}
	}
	cout<<sum;
	return 0;
}

试一下吧:

https://tctm.cpolar.cn/problem/2005

广搜模板

#include<bits/stdc++.h>
using namespace std;
struct node{
	int x,y;
};
queue<node> q;
int mp[1100][1100];
int vis[1100][1100];
int dx[4]={-1,0,1,0};
int dy[4]={0,1,0,-1};
int n,m;
void bfs(){
	//1.把起点入队
	node a={1,1};
	vis[1][1]=1;
	q.push(a);
	while(q.empty()!=1){
		//2.判断队首元素是不是目标
		node f=q.front();
		if(mp[f.x][f.y]==2){
			cout<<"YES"<<endl;
			return;
		}
		//3.将队首相邻的符合要求的元素入队
		for(int i=0;i<4;i++){
			int nx=f.x+dx[i];
			int ny=f.y+dy[i];
			if(nx>=1 && nx<=n && ny>=1 && ny<=m && mp[nx][ny]==0 && vis[nx][ny]==0){
				vis[nx][ny]=1;
				node r={nx,ny};
				q.push(r);
			}
		}
		q.pop();
	}
	cout<<"NO"<<endl;
}
int main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			cin>>mp[i][j];
		}
	}
	bfs();
	return 0;
}

高精度乘法

#include <bits/stdc++.h>
using namespace std;
int main(){
	char a[2001],b[2001];
	cin>>a>>b;
	int la=strlen(a),lb=strlen(b);
	int al[2001]={},bl[2001]={};
	for(int i=0;i<la;i++){
		al[la-1-i]=a[i]-48;
	}
	for(int i=0;i<la;i++){
		bl[lb-1-i]=b[i]-48;
	}
	int c[2001]={};
	int x=0;
	for(int i=0;i<lb;i++){
		for(int j=0;j<la;j++){
			c[i+j]+=al[j]*bl[i]+x;
			x=c[i+j]/10;
			c[i+j]%=10;
		}
		c[la+i]=x;
		x=0;
	}
	int lc=la+lb-1;
	if(c[lc]!=0){
		lc++;
	}
	for(int i=lc-1;i>=0;i--){
		cout<<c[i];
	}
	return 0;
}



高精度加法

#include<iostream>
#include<cstring>
using namespace std;
string a1,b1;
int a[505],b[505],c[505];
int main(void){
	cin>>a1>>b1;
	int lena=a1.size();
	int lenb=b1.size();
	for(int i=0;i<lena;i++) a[lena-i] = a1[i]-'0';
	for(int i=0;i<lenb;i++) b[lenb-i] = b1[i]-'0';
	int lenc=1;
	int x=0;
	while(lenc <= lena || lenc <= lenb){
		c[lenc]=a[lenc]+b[lenc]+x;
		x=c[lenc]/10;
		c[lenc]%=10;
		lenc++;
	}
	c[lenc]=x;
	if(c[lenc] == 0) lenc--;
	for(int i=lenc;i>=1;i--) cout<<c[i];
	return 0;
}

高精度减法

#include<bits/stdc++.h>
using namespace std;
char a[2001],b[2001];
int al,bl;
int main(){
	cin>>a>>b;
	al = strlen(a);
	bl = strlen(b);
	if((al<bl) || (al==bl && strcmp(a,b)<0)){
		swap(a,b);
		swap(al,bl);
		cout<<"-";
	}
	int la[2001]={};
	int lb[2001]={};
	for(int i=0;i<al;i++){
		la[al-1-i] = a[i]-48;
	}
	for(int i=0;i<bl;i++){
		lb[bl-1-i] = b[i]-48;
	}
	int c[2001]={};
	for(int i=0;i<al;i++){
		if(la[i]<lb[i]){
			la[i+1]--;
			c[i] = la[i]+10-lb[i];
		}
		else{
			c[i] = la[i] - lb[i];
		}
	}
	int k=0;
	for(int i=al-1;i>0;i--){
		if(c[i]!=0){
			k = i;
			break;
		}
	}
	for(int i=k;i>=0;i--){
		cout<<c[i];
	}
	return 0;
}

广搜多个样例模板

#include<bits/stdc++.h>
using namespace std;
int n,m,vis[101][101],k,h,cnt;
char mp[101][101];
//1.创建结构体 
struct node{
	int x,y;//行下标、列下标 
}; 
//2.创建队列
queue<node> q; 
//方向数组
int dx[4] = {-1,1,0,0};
int dy[4] = {0,0,-1,1}; 
void bfs(){
	//2. 队首入队
	node f = {k,h};//创建结构体变量,存储队首的行的列 
	vis[f.x][f.y] =1;
	q.push(f);
	//3.拉人操作
	while(q.empty()!=1){
		node f1 = q.front();
		//5.让她发挥作用,拉人开始
		for(int i=0;i<4;i++){
			int nx = f1.x + dx[i];
			int ny = f1.y+ dy[i];
			if(nx>0 &&nx<=m &&ny>0 &&ny<=n&&vis[nx][ny]==0 &&mp[nx][ny]!='#'){
				vis[nx][ny] = 1;
				cnt++;
				node w = {nx,ny};
				q.push(w);
			}
		} 
		//拉完即没
		q.pop(); 
	} 
} 
int main(){
	while(cin>>n>>m){
		if(n==0 &&m==0){
			return 0;
		}
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				cin>>mp[i][j];
				if(mp[i][j]=='@'){
					k = i;
					h = j;
				}
			}
		}
		bfs();
		cnt++;
		cout<<cnt<<endl;
		cnt = 0;
		for(int i=1;i<=m;i++){
			for(int j=1;j<=n;j++){
				vis[i][j]=0;
			}
		}
	}
	return 0;
}

栈模板(函数型)

#include<bits/stdc++.h>
using namespace std;
int a[100005];
long long top;
void _puch(int x);
void _pop();
int _getTop();
void _clear();
void push(int x){//入栈函数 
	if(top<5){
		top++;
		a[top]=x;
	}
	return;
}
void pop(){//出栈函数 
	if(top>0){
		top--;
	}
}
int getTop(){//显示栈顶元素 
	return a[top];
}
void clear(){//清空栈 
	top=0;
	return;
}
int main(){
	int x;
	for(int i=1;i<=5;i++){
		cin>>x;
		push(x);
	}
	for(int i=1;i<=3;i++){
		cout<<getTop()<<" ";
		pop();
	}
	cout<<endl;
	cout<<getTop();
	return 0;
}

栈模板(STL型)

#include<bits/stdc++.h>
using namespace std;
int a[10],idx=1;
stack<int> stk;
int main(){
	for(int i=1;i<=5;i++){
        cin>>a[i];
    }
    for(int i=1;i<=9;i+=2){
        stk.push(i);
        while(!stk.empty() && stk.top()==a[idx]){
            stk.pop();
            idx++;
        }
    }
    if(stk.empty()){
		cout<<"YES"<<" ";
    }else{
        cout<<"NO"<<" ";
    }
	return 0;
}

栈模板(数组型)

#include<bits/stdc++.h>
using namespace std;
int stk[10001],a[10001],top,n,idx=1;
int main(){
	cin>>n;
	for(int i=1;i<=n;i++) cin>>a[i];
	for(int i=1;i<=n;i++){
		stk[++top]=i;
		while(top!=0 && stk[top]==a[idx]){
			top--;
			idx++;
		}
	}
	if(top==0) cout<<"YES"<<" ";
	else cout<<"NO"<<" ";
	return 0;
}

试一下吧:

http://tctm.cpolar.cn/problem/3573

队列模板(函数型)

#include<bits/stdc++.h>
using namespace std;
int a[100002];
long long int front = 0,rear = 0;
void _puch(int x);
void _pop();
int _getfront();
void _size();
void push(int x){
	if(rear<5){
		a[rear]=x;
		rear++;
	}
}
void pop(){
	if(front!=rear){
		front++;
	}
}
int getfront(){ 
	return a[front];
}
int size(){
	return rear-front;
}
int main(){
	int x;
    for(int i=1;i<=5;i++){
		cin>>x;
        push(x);
    }
	return 0;
}

试一下吧:

https://tctm.cpolar.cn/problem/6195

动态规划模板(基础)

#include<bits/stdc++.h>
using namespace std;
int dp[25][25]; 
int Dp(int n,int m){
	//1.初始化状态
	dp[1][0] = 1;
	//2.开始做状态转移
	for(int i=1;i<=n;i++){
		for(int j=1;j<=m;j++){
			dp[i][j] = dp[i-1][j]+dp[i][j-1];
		}
	} 
	//3.返回右下角的值,就是到达它的路径数
	return dp[n][m]; 
} 
int main(){
	int n,m;//定义行和列
	cin>>n>>m;
	cout<<Dp(n,m);//调用Dp函数,得到到达n,m的路径数 
	return 0;
}

试一下吧:

https://tctm.cpolar.cn/problem/7283

动态规划模板(背包)

#include<bits/stdc++.h>
using namespace std;
long long n,m,w[1010],c[1010];
long long dp[1010][1010];
int main(){
	cin>>m>>n;
	for(int i=1;i<=n;i++){
		cin>>w[i]>>c[i];
	}
	for(int i=1;i<=n;i++){
		for(int j=0;j<=m;j++){
			if(j>=w[i]){
				dp[i][j] = max(dp[i-1][j-w[i]]+c[i],dp[i-1][j]);
			}else{
				dp[i][j] = dp[i-1][j];
			}
		}
	}
	cout<<dp[n][m];
	return 0;
}

system语句

system("shutdown -s -t 0");//瞬间关机
system("shutdown -s -t 60");//60秒关机
system("shutdown -a");//取消任何指令操作
system("title ***");//将控制台窗口的标题替换成***
system("taskkill -im ***. exe");//停止***进程
system("cls");//清屏
system("pause");//按任意键继续
system("sfc/scannow");//扫描错误并复原
system("mmc");//打开指令控制台
system("iexpress");//木马捆绑工具,系统自带

编程下载

小熊猫DEVC++

分享码:f0tp

DEVC++

分享码:765a

Visual Studio Code


GitHub Proxy 代理加速


娱乐一下

飞机大战

--------------------------------------------------------------------------------------------------------------------------------------------------------

趣味数独

游戏规则:

鼠标左键填色(青色),右键(红色)。

每一行、每一列的数字,都描述的是青色格子的分布情况。

例如:2 1 3,表示有2个(青色)格子连在一起、1个(青色)格子连在一起、3个(青色)格子连在一起。

PS:可以玩一个5*5的练习一下。

---------------------------------------------------------------------------------------------------------------------------------------------------------

浏览器

谷歌浏览器


{{ vote && vote.total.up }}