打明天的卡,让明天无卡可打

归辞_备赛版 2023-03-12 22:55:49

第一题 裁纸刀

这一题就单纯靠想

我就先竖着切,切21刀,出来22个纸条,每个纸条又要切19刀,再加上边界的四刀

package month_training;

public class 裁纸刀 {
	public static void main(String[] args) {
		int count = 4;
		System.out.print(4+21+22*19);
	}

}

第二题 刷题

这题是我调了好久好久,最后发现是特殊情况判断的语句写错了

总体上的思路就是用星期作为单位,然后用n除以我一周能刷的题目个数,得到count

然后count减去count对1取余,化为整数。

然后进行判断,如果此时n-count*week==0(week代表一周能刷的题目数)

说明我正好除干净了,直接输出count*7

不然的话,先遍历周一到周五,如果依然没有符合条件的

那我就直接输出周六......(突然发现问题在哪了.......就是说,如果只差1题就满足这个星期的题目个数的话,实际上我要周日才能完成)

hhhhh,写题解果然是有用的,我说为什么一个样例一直过不去(真的是这个问题hhhh.....大意了)

好的,那这个情况怎么判断呢,那我上来就减去周六刷的题,然后让剩余的和零比较,只要大于,那我就输出周日;

package month_training;

import java.math.BigInteger;
import java.util.Scanner;

public class 刷题 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		BigInteger a = sc.nextBigInteger();
		BigInteger b = sc.nextBigInteger();
		BigInteger n = sc.nextBigInteger();
		BigInteger week = a.multiply(BigInteger.valueOf(5)) ;
		week = week.add(b.multiply(BigInteger.valueOf(2)));
		BigInteger tmp = n;
		BigInteger count = BigInteger.valueOf(0);
		count= tmp.divide(week);
		count = count.subtract(count.remainder(BigInteger.valueOf(1)));
		tmp = tmp.subtract(week.multiply(count));
		
		if(tmp.compareTo(BigInteger.valueOf(0))==0) {
			count = count.multiply(BigInteger.valueOf(7));
			System.out.println(count);
			return;
		}
		for(int i = 1 ;i<=5;i++) {
			tmp = tmp.subtract(a);
			if(tmp.compareTo(BigInteger.valueOf(0)) != 1) {
				count = count.multiply(BigInteger.valueOf(7));
				count = count.add(BigInteger.valueOf(i));
				System.out.println(count);
				return;
			}
		}
		tmp = tmp.subtract(b);
		if(tmp.compareTo(BigInteger.valueOf(0))!=1) {
			count = count.multiply(BigInteger.valueOf(7));
			count = count.add(BigInteger.valueOf(6));
			System.out.println(count);
			return;
		}
		count = count.add(BigInteger.valueOf(1));
		count = count.multiply(BigInteger.valueOf(7));
		System.out.println(count);
	}

}

第三题 修建灌木

这题我是手推找规律的,首先这个答案一定是左右对称的,那我只需要分析一半即可,注意奇偶情况分类。

然后第i个灌木可以长2*(n-i)的最大长度,中间(奇数列)的就是n-1

package month_training;

import java.util.Scanner;

public class 修建灌木 {
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n =sc.nextInt();
		int[] ans = new int[n+1];
		if(n%2 == 0) {
			for(int i = 1;i<=n/2;i++) {
				ans[i] = 2*(n-i);
				ans[n+1-i] = ans[i];
			}
		}
		if(n%2==1) {
			for(int i = 1; i<=(n-1)/2;i++) {
				ans[i] = 2*(n-i);
				ans[n+1-i] = ans[i];
			}
			ans[(n+1)/2] = n-1;
		}
		for(int i =1 ;i<=n;i++) {
			System.out.println(ans[i]);
		}
	}

}

第四题 k倍区间

这题的话用到了同余数定理

什么意思呢,就是如果a%k == 1 b%k == 1 则 (a-b)%k == 0

所以,只要余数相同,k倍区间就加一。

我的代码多建立了一个数组,其实只要一个前缀和数组就ok了

package month_training;
import java.io.*;
public class k倍数区间 {
	static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
	public static void main(String[] args)throws IOException {
		String[] s = br.readLine().split(" ");
		long n = Integer.parseInt(s[0]);
		long k = Integer.parseInt(s[1]);
		long[] ans = new long[(int) (n+3)];
		long[] qzh = new long[(int) (n+3)];
		long[] div = new long[(int) (n+3)];
		for(int i = 1;i<=n;i++) {
			ans[i] = Integer.parseInt(br.readLine());
			qzh[i] = qzh[i-1] + ans[i];
		}
		div[0] = 1;
		int an = 0;
		for(int i = 1;i<=n;i++) {
			an += div[(int) (qzh[i]%k)];
			div[(int) (qzh[i]%k)]++;
		}
		System.out.print(an);
	}

}

第五题 

看梗佬题解去了.....hhhh自动放弃

这种类型的题目属于是给我看一天也没啥用的。

(补于3.13早上七点三十五

经过昨晚的苦战,以及今天早上的奋战,总算把恐怖版的大概模型搞出来了,......单纯c++看不太懂

然后放一个java的大概代码在下面吧,大家可以结合梗佬的题解去看

只能说大体框架对了,但是小错误可能很多

我没有那个能力去调了hhhhh,很菜

希望有能力的大佬能补全,溜了溜了,晚上回来再看

package month_training;

import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
import java.util.List;
import java.util.Scanner;

public class 树状数组 {
	static HashMap<Integer, List<Integer>> map1 = new HashMap<>();
	static HashMap<Integer, List<Integer>> map2 = new HashMap<>();
	public static void main(String[] args) {
		Scanner sc = new Scanner(System.in);
		int n = sc.nextInt();
		int k = sc.nextInt();
		int[] qzh=new int[n+3];
		for(int i =1 ;i<=n;i++) {
			qzh[i] =sc.nextInt();
			qzh[i] = qzh[i]+qzh[i-1];
		}
		for(int i=0;i<=n;i++) {
			add(true,qzh[i],qzh[i]%k);
			add(false,i,qzh[i]%k);
		}
		int ans =0;
		TreeArray t =new TreeArray(n+5);
		List<Integer> q = new ArrayList<>(map1.keySet());
		for(Integer qq:q) {
			List<Integer> tmp = map1.get(qq);
			//Collections.sort(tmp);
			
			if(qq>=0) {
				for(int i = 0;i<tmp.size();i++) {
					for(int j = i+1;j<tmp.size();j++) {
						if(tmp.get(j)>=tmp.get(i)) {
							ans += t.getsum(j-1+1);
							t.update(j-1+1, 1);
						}
					}
				}
				if(map1.containsKey(qq-k)) {
					List<Integer> tmp3 = map2.get(qq);
					List<Integer> tmp4 = map2.get(qq-k);
					for(int i = 0;i<tmp.size();i++) {
						for(int j = i+1;j<tmp4.size();j++) {
							if(tmp4.get(j)>tmp3.get(i)) {
								ans+=t.getsum(j-1+1);
								t.update(j-1+1, 1);
							}
							
						}
						
					}
				}
				
			}
			else {
				for(int i = 0;i<tmp.size();i++) {
					for(int j = i+1;j<tmp.size();j++) {
						if(tmp.get(j)>=tmp.get(i)) {
							ans += t.getsum(j-1+1);
							t.update(j-1+1, 1);
						}
					}
				}
				
			}
			
		}
	}
	static void add(boolean a,int y,int x) {
		if(a) {
			if(!map1.containsKey(x)) {
				map1.put(x, new ArrayList<>());
			}
			map1.get(x).add(y);
		}
		if(!a) {
			if(!map2.containsKey(x)) {
				map2.put(x, new ArrayList<>());
			}
			map2.get(x).add(y);
		
	}
	}
	static class TreeArray {
		int[] A;
		int[] C;
		int n;
		/*public  TreeArray(int[] A) {
			this.A = new int[A.length];
			n= A.length;
			C = new int[n+1];
			for(int i=0;i<=A.length;i++) {
				update(i,A[i-1]);
			}
		}*/
		public  TreeArray(int n) {
			this.A = new int[n];
			C = new int[n+1];
			for(int i=0;i<=A.length;i++) {
				update(i,A[i-1]);
			}
		}
		public int lowbit(int x) {
			return x&(-x);
			}
		
		public void update(int i,int val) {
			int deta = val - A[i-1];
			A[i-1] = val;
			for(int pos = i;pos<=n;pos+=lowbit(pos)) {
				C[pos] +=deta;
			}
		}
		public int getsum(int pos) {
			int sum=0;
			for(int i=pos;i>=1;i-=lowbit(i)) {
				sum = sum+C[i];
			}
			return sum;
		}
		public int sumRange(int start,int end) {
			if(start<1 || start >n ||end <1||end>n) {
				return -1;
			}
			else return getsum(end)-getsum(start-1);
		}
	}
	
}

	

 

...全文
55 回复 打赏 收藏 转发到动态 举报
写回复
用AI写文章
回复
切换为时间正序
请发表友善的回复…
发表回复

50,780

社区成员

发帖
与我相关
我的任务
社区描述
和众多高校算法内卷分子,一起学习和交流算法那。浓郁的算法交流氛围,拒绝躺平,有效内卷。加入我们,私信我拉你入核心内卷群。
算法数据结构leetcode 个人社区
社区管理员
  • 执 梗
  • Dream-Y.ocean
  • ღCauchyོꦿ࿐
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

 刷题!

试试用AI创作助手写篇文章吧