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");//木马捆绑工具,系统自带
编程下载
分享码:f0tp
分享码:765a
娱乐一下
--------------------------------------------------------------------------------------------------------------------------------------------------------
游戏规则:
鼠标左键填色(青色),右键(红色)。
每一行、每一列的数字,都描述的是青色格子的分布情况。
例如:2 1 3,表示有2个(青色)格子连在一起、1个(青色)格子连在一起、3个(青色)格子连在一起。
PS:可以玩一个5*5的练习一下。
---------------------------------------------------------------------------------------------------------------------------------------------------------