藍橋杯Java重要語法+模板API 個人總結向

留坑,暫時沒時間準備藍橋杯,等省賽前兩週再來準備。
龜速更新

基操

代碼如下:

//格式控制
double ans=0.11111111;
String.format("%.2f", ans)

//大小寫
s=s.toLowerCase();

//輸入字符數組
c[i] = reader.nextLine().toCharArray();

//排序  1~n
 Arrays.sort(a,1,1+n);


map

代碼如下:

HashMap<Integer,Integer> map = new HashMap<Integer,Integer>();

map.containsKey(x) 			 //返回bool 查看map中是否有x

map.put(x, k);				 // 給x設置k

map.get(x); 				 // 獲取x的鍵值對

for(int u : map.values() )   // 遍歷map的元素集

for(int v : map.keySet() )   // 遍歷map的鍵值對集 

map.put(s,(map.get(s)==null?1:map.get(s)+1));  //基操


BigInteger

代碼如下:

//大整數循環
BigInteger a = cin.nextBigInteger();
for(BigInteger i=BigInteger.ONE;i.compareTo(a)<=0;i=i.add(BigInteger.ONE)) 



最大公約數以及最小公倍數

代碼如下:

	static int gcd(int a, int b) { //最大公約數
		if(b==0) return a;
		else return gcd(b,a%b);
	}
	static int lcm(int a,int b) { //最小公倍數
		return a*b/gcd(a,b);
	}


揹包系列

代碼如下:

	for(int i=1;i<=n;i++)
        	for(int j=V;j>=v[i];j--)
        		dp[j]=Math.max(dp[j], dp[j-v[i]]+w[i]);


枚舉子集

代碼如下:

//dfs
static void dfs(int cnt,int tot,int sum) {
	if() return ;
	vis[]=true;
	if() return ;
	dfs(cnt+1,tot+1,sum+a[tot]);
	dfs(cnt,tot+1,sum);
}
//二進制枚舉
for(int i=0;i< (1<< ) ;i++) {
	int res=0;
	if(count(i)> ) continue;
	for(int j=0;j< ;j++) 
		if( ((i>>j)&1) == 1)
			res+= ;
	if( ) vis[res]=true;
}


矩陣快速冪

代碼如下:

	static int n,m;
	public static int[][] mul(int a[][],int b[][])
	{
		int ans[][]=new int[n][n];
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				ans[i][j]=0;
		for(int i=0;i<n;i++)
			for(int j=0;j<n;j++)
				for(int k=0;k<n;k++)
					ans[i][j]=ans[i][j]+a[i][k]*b[k][j];
		
		return ans;
	}
	
	public static int[][] qp(int a[][],int b)
	{
		int ans[][]=new int[n][n];
		for(int i=0;i<n;i++)
			ans[i][i]=1;
		while(b!=0)
		{
			if(b%2==1) ans=mul(ans,a);
			a=mul(a,a);
			b>>=1;
		}
		return ans;
	}


字符串的最小循環節/循環週期

代碼如下:

public class Main {
 
	static int nexts[]=new int[1000000];
	static char p[]=new char[1000000];
	static int m;
	
	static void getnexts() {
		int i=0,j=-1;
		nexts[i]=j;
		while(i<m) {
			if(j==-1||p[i]==p[j]) nexts[++i]=++j;
			else j=nexts[j];
		}
	}
    public static void main(String[] args) {
        Scanner cin = new Scanner(System.in);
        
        String s=cin.next();
        m=s.length();
        p=s.toCharArray();
        getnexts();
        int ans=m-nexts[m];
        if(m%ans==0&&ans!=m) System.out.println(m/ans);
        else System.out.println(1);
    }
}


------------ 圖論分割線 --------------

圖論開荒必備技能

代碼如下:

// 鄰接表建圖
public class Main {
	static ArrayList<Integer>[] edge = new ArrayList[105];

	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		
		int n = cin.nextInt();
		for(int i=1;i<=n;i++) 
			edge[i] = new ArrayList<>();
		for(int i=1;i<n;i++) {
			int u= cin.nextInt() , v= cin.nextInt();
			edge[u].add(v);
			edge[v].add(u);
		}	
	}
}

//前向星
public class Main {
	class node{
		int v,next;
	}
	static node a[] =new node[100005];
	static int head [] =new int[100005];
	static int k=0;
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		Main main= new Main();
		int n = cin.nextInt();
		for(int i=1;i<n;i++) {
			int u= cin.nextInt() , v= cin.nextInt();
			a[++k]=main.new node();
			a[k].v=v;
			a[k].next=head[u];
			head[u]=k;
		}	
	}
}

最小生成樹

代碼如下:

public class Main {
	
	public class node implements Comparable{
		int u,v,w;
		node(int a, int b , int c){
			this.u=a;
			v=b;
			w=c;
		}
		public int compareTo(Object o) {
			if(o instanceof node) {
				node b = (node)o;
				if(this.w>b.w) return 1;
				else if(this.w==b.w) return 0;
				else return -1;
			}
			return 0;
		}
	}
	static node a[]= new node[100005];
	static int f[] =new int[10005];
	
	private static int find(int x) {
		if(f[x]==x) return x;
		else return f[x]=find(f[x]);
	}	
	
    public static void main(String[] args) {
        Scanner cin=new Scanner(System.in);
        Main mains = new Main();
        int n= cin.nextInt();
        int m= cin.nextInt();
        for(int i=1;i<=n;i++) f[i]=i;
        for(int i=1;i<=m;i++) {
        	int u=cin.nextInt(),v=cin.nextInt(),w=cin.nextInt();
        	a[i]=mains.new node(u,v,w);
        }
        Arrays.parallelSort(a,1,1+m);
        long ans=0;
        int cnt=1;
        for(int i=1;i<=m;i++) {
        	int u=a[i].u,v=a[i].v,w=a[i].w;
        	int fu = find(u) , fv=find(v);
        	if(fu==fv) continue;
        	if(fu<fv) f[fv]=fu;
        	else f[fu]=fv;
        	cnt++;
        	ans+=w;
        	if(cnt==n) break;
        }
        System.out.println(ans);
    }
}


樹的直徑

代碼如下:

public class Main {
	
	static ArrayList<Integer>[] edge = new ArrayList[100005];
	static int dp[] =new int[100005];
	static boolean vis[] =new boolean[100005];
	static int ans=0;
	
	static void dfs(int u) {
		vis[u]=true;
		for(int v : edge[u]) {
			if(vis[v]) continue;
			dfs(v);
			ans=Math.max(ans, dp[u]+dp[v]+1);
			dp[u]=Math.max(dp[u], dp[v]+1);
		}
	}
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		Main main= new Main();
		
		int n= cin.nextInt();
		for(int i=1;i<=n;i++) 
			edge[i] = new ArrayList<>();
		for(int i=1;i<n;i++) {
			int u=cin.nextInt(),v=cin.nextInt();
			edge[u].add(v);
			edge[v].add(u);
		}
		dfs(1);
		System.out.println(ans);
	}
}


拓撲排序

代碼如下:

public class Main {
	
	static ArrayList<Integer>[] edge = new ArrayList[100005];
	static int d[] =new int [100005];
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		Main main= new Main();
		
		int n= cin.nextInt(),m=cin.nextInt();
		for(int i=1;i<=n;i++) edge[i]=new ArrayList<>();
		for(int i=1;i<=m;i++) {
			int u=cin.nextInt(),v=cin.nextInt();
			edge[u].add(v);
			d[v]++;
		}
		Queue<Integer> q= new LinkedList<Integer>();
		for(int i=1 ;i<=n;i++) {
			if(d[i]==0)
				q.add(i);
		}
		ArrayList<Integer> ans= new ArrayList<Integer>();
		while(q.size()>0){
			int u=q.poll();
			ans.add(u);
			for(int v : edge[u]) {
				d[v]--;
				if(d[v]==0) q.add(v);
			}
		}
		for(int i: ans) System.out.println(i);
	}
}


最短路

代碼如下:

public class Main {
	
	class edge {
		int v, next ,w;
	}
	static int head[] = new int[1005];
	static int d[] = new int[1005];
	static boolean vis[] =new boolean[1005];
	static edge a[] =new edge[20001];
	static int n,m,k=0;
	
	static class node implements Comparable<node>{
		int w,u;
		public node(int w,int u) {
			this.w=w; this.u=u;
		}
		public int compareTo(node a) {
			if(w>a.w) return 1;
			else if(w==a.w) return 0;
			else return -1;
		}
	}
	
	public static void main(String[] args) {
		Scanner cin = new Scanner(System.in);
		Main main= new Main();
		
		n= cin.nextInt(); m=cin.nextInt();
		for(int i=1;i<=2*m;i++)
			a[i]=main.new edge();
		for(int i=1;i<=m;i++) {
			int u=cin.nextInt(),v=cin.nextInt(),w=cin.nextInt();
			a[++k].v=v; a[k].next=head[u]; a[k].w=w; head[u]=k;
			a[++k].v=u; a[k].next=head[v]; a[k].w=w; head[v]=k;
		}
		PriorityQueue<node> q = new PriorityQueue<>();
		q.add( new node(0,1) );
		for(int i=1;i<=n;i++) d[i]=0x3f3f3f3f;
		d[1]=0;
		while(q.size()>0) {
			node x = q.poll();
			int u=x.u;
			if(vis[u]) continue;
			vis[u]=true;
			for(int i=head[u];i>0;i=a[i].next) {
				int v=a[i].v,w=a[i].w;
				if(!vis[v]&&d[v]>d[u]+w) {
					d[v]=d[u]+w;
					q.add(new node(d[v],v));
				}
			}
		}
		System.out.println(d[n]);
	}
}


------------ Java表達C++函數分割線 --------------

__builtin_popcountll

代碼如下:

private static int count(int i) {
		int cnt =0;
		while(i>0) {
			if((i&1)==1) cnt++;
			i>>=1;
		}
		return cnt;
	}
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章