package src;
import java.util.Scanner;
public class 模板 {
public static void main(String[] args) {
}
/**
* 最小公倍数
*/
static long gcd(long a , long b) {
return b==0?a:gcd(b,a%b);
}
/**
* 最大公约数
*/
static long lcm(long a,long b) {
return a*b/gcd(a,b);
}
/**
* 01背包
*/
static void f() {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[] dp = new int[m+5];
for(int i=1;i<=n;i++) {
int v = sc.nextInt();
int w = sc.nextInt();
for(int j=m;j>=v;j--) {
dp[j] = Math.max(dp[j], dp[j-v]+w);
}
}
System.out.println(dp[m]);
}
/**
* 完全背包
*/
static void ff() {
Scanner sc = new Scanner(System.in);
int m = sc.nextInt();
int n = sc.nextInt();
int[] dp = new int[m+5];
for(int i=1;i<=n;i++) {
int v = sc.nextInt();
int w = sc.nextInt();
for(int j=v;j<=m;j++) {
dp[j] = Math.max(dp[j], dp[j-v]+w);
}
}
System.out.println(dp[m]);
}
/**
* 二分Lower_bound的实现
*/
static int lowerBound(int[] nums,int l,int r,int target) {
while(l < r) {
int m = (l + r)/2;
if(nums[m] >= target) r=m-1;
else l = m+1;
}
return l;
}
/**
* 快速幂
*/
static long mpow(long a,long b) {
long res = 1;
if(b>0) {
if((b & 1) == 1) {
res *= a;
}
a *= a;
b >>= 1;
}
return res;
}
/**
* 全排列
*/
static int ans=0;
static void f(int k,int[] arr) {
if(k == 7) {
ans++;
// set.add(sb.toString());
return;
}
for(int i=k;i<7;i++) {
// sb.append(str[i]);
// String s = str[i];
// str[i] = str[k];
// str[k] = s;
int temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
f(k+1,arr);
temp = arr[i];
arr[i] = arr[k];
arr[k] = temp;
// sb.deleteCharAt(sb.length()-1);
// s = str[i];
// str[i] = str[k];
// str[k] = s;
}
}
/**
* 欧拉函数
*/
static int Euler(int n) {
int ans = n;
for(int i=2;i*i<=n;i++) {
if(n % i == 0) {
ans = ans / i * (i-1);
while(n % i == 0) n/=i;
}
}
return ans;
}
/**
* dfs求连通块
*/
static int n,m;
static int[][] vis;//是否访问过,0为未访问
static char[][] ch;
static int[] dx = new int[] {1,1,1,0,0,-1,-1,-1};
static int[] dy = new int[] {0,-1,1,1,-1,1,0,-1};
static void dfs(int t,int x,int y) {
vis[x][y] = t;
for(int i=0;i<8;i++) {
//保证x+dx[i],y+dy[i]分别在[0,n)和[0,m)范围之内
if(x+dx[i] >= 0 && x+dx[i]<n && y+dy[i]>=0 && y+dy[i]<m &&ch[x+dx[i]][y+dy[i]]=='@' && vis[x+dx[i]][y+dy[i]]==0) {
dfs(t,x+dx[i],y+dy[i]);
}
}
}
/**
* 并查集
*/
static int[] pre;
static int find(int k) {
if(pre[k]==k) return k;
return pre[k]=find(pre[k]);
}
static void merge(int x , int y) {//合并集合
int t1 = find(x); //找到x和y的根节点
int t2 = find(y);
if(t1 != t2) pre[t1] = t2;
}
/**
* 约瑟夫环公式
* n: 人的个数
* m: 报数报到m时剔除
*/
public static int cir(int n,int m){
int p = 0;
for(int i=2;i<=n;i++){
p = (p+m)%i;
}
return p+1;
}
/**
* 埃氏筛法O(1)
* 在x范围内,大概有x/logx个素数
* @param N 第N个素数
*
*/
private static void ass(long N){
int n = 2;//定义的数组长度
while(n / Math.log(n) < N) ++n;
int[] arr = new int[n];
int x = 2;
while (x < n){
//标记过了,继续下一个
if(arr[x] != 0){
x++;
continue;
}
//筛完后,我们从2倍开始,对x的k倍,全部标记为-1
int k = 2;
while(x * k < n){
arr[x * k] = -1;
k++;
}
x++;
}
//筛完之后,这个很长的数组里面非素数下标对应的值都是-1
int sum = 0;
for(int i=2;i<arr.length;i++){
//是素数,计数+1
if(arr[i] == 0) sum++;
if(sum == N) {
System.out.println(i);
return;
}
}
}
/**
* 日期运算Calendar的使用
*/
public static void main(String[] args) {
Calendar calendar = Calendar.getInstance();
for (int i = 1999; i < 10000; i+=100) {
calendar.set(i, 11, 31);//月份从0开始计算
if(calendar.get(Calendar.DAY_OF_WEEK) == 1) {
System.out.println(i); //2299
break;
}
}
}
/**
* 取模技巧
*/
public static void mod(){
int a,b,c;
(a * b) % c = ((a % c) * (b % c) ) % c;
(a + b) % c = ((a % c) + (b % c) ) % c;
}
/**
* 12.3 钟表类型的计算
* 比如一个数字只在0-12,当12 再加 1 就变成 0
* 那么 num = num % 12 ;
* 利用这个将减法变成加法 还是上面的例子,一个数减1 就等于这个数加 12
* 比如:0 - 1 = 12
* 转换成 0 + 12 = 12
* 也就是 (num-1) % 12 = (num+12)%12
* 这里只是举了一个特例 取余的那个数为 12 。具体遇到特殊情况,特殊对待
*/
/**
* 四联通
* 设置一个二维数组为dirs[4][2] = [ [-1,0] , [0,1] , [1,0], [-1,0] ] //分别代表上,右,下,左
*/
public static void forth(){
dirs[4][2] = [ [-1,0] , [0,1] , [1,0], [-1,0] ];
for (int d = 0; d < 4; d++) {
nextx = x + dirs[d][0];
nexty = y + dirs[d][1];
}
}
/**
* 八连通
*/
public static void eighth(){
for (int i = -1; i < 2; i++) {//-1 0 1
for (int j = -1; j < 2; j++) { // -1 0 1
if(i==0 && j==0) //排除自身,剩下的就是8个方向
continue;
//.....
}
}
}
/**
* 尺取法:求两个数的和为m
*/
void findSumEqualsM(int a[],int n,int m){
sort(a,a+n); //#先排序,复杂度O(nlogn)
int i=0,j=n-1; //#i指向头,j指向尾
while(i<j){
int sum=a[i]+a[j];
if(sum<m) i++;
else if(sum>m) j--;
else{
cout<<a[i]<<" "<<a[j]<<endl;
i++;
}
}
}
/**
* Queue中的PriorityQueue类
* PriorityQueue new Compatator<>(){}
*/
static Queue<Point> queue = new PriorityQueue<>(new Comparator<Point>() {
@Override
public int compare(Point o1, Point o2) {
return o1.len-o2.len;
}
});
/**
* 斐波那契公式
* F(n)=(1/√5)*{[(1+√5)/2]^n - [(1-√5)/2]^n}【√5表示根号5】
*/
public static long fibo(int n){
return ((Math.sqrt(5)/5)*(Math.pow((1+Math.sqrt(5))/2),n) - Math.pow((1-Math.sqrt(5))/2,n))
}
/**
* 快速输入
*/
static class InputReader {
private BufferedReader bf = null;
private StringTokenizer stz = null;
public InputReader() {
bf = new BufferedReader(new InputStreamReader(System.in),32*1024);
}
public boolean hasNext() {
while(stz == null || !stz.hasMoreTokens()) {
try {
stz = new StringTokenizer(bf.readLine());
} catch (IOException e) {
return false;
}
}
return true;
}
public String next() {
if(hasNext()) {
return stz.nextToken();
}
return null;
}
public int nextInt() {
return Integer.parseInt(next());
}
public double nextDouble() {
return Double.parseDouble(next());
}
}
}
蓝桥基础模板
最新推荐文章于 2022-04-10 19:00:50 发布