蓝桥杯15届JAVA_A组
将所有1x1转化为2x2 即1x1的方块➗4 然后计算平方数 记得-1 ×2
import java.io.BufferedReader;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;public class Main{static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));public static void main(String[] args) {long a1 = 7385137888721L + (long)10470245L/4;long i;for(i = 1l;i*i<=a1;i++) {}
// out.println(i*i-7385137888721L);out.println((i-1)*2);out.flush();}
}
往简单了想,想不出来就看看小范围内的规律
可以先小范围的写1-10观察规律!!
首先一个奇数一定可以写成两项相加的形式,所以奇数一定有诗意
所以只要一个数有奇数因子那么就有诗意 它可以看作一个奇数✖倍数
这说明了如果一个数没有奇数因子 那么就没有诗意 那么什么数没有奇数因子呢?只能是偶数,而且是特殊的偶数 是2的倍数 才能做到没有一个奇数因子
所以这一题就转化成了2的整数倍的数没有诗意 那么答案就是数组中2的整数倍的数的个数!!
差分 + 贪心
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;public class Main{static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static int n;static int[] a; static int[] b;public static void main(String[] args) throws IOException {n = Integer.parseInt(in.readLine());String[] p = in.readLine().split(" ");a = new int[n+1];b = new int[n+1];for(int i=1;i<=n;i++) {a[i] = Integer.parseInt(p[i-1]);}for(int i=1;i<=n/2;i++)b[i] = a[n-i+1] - a[i];int ans = 0;for(int i=1;i<=n/2;i++) {//只转化左边与右边相同即可//只改变a[i]使之相同ans += Math.abs(b[i]);if(b[i]*b[i+1]>0) {//同号 下一个数要操作的次数更多 if(Math.abs(b[i+1])>Math.abs(b[i])) b[i+1]-=b[i];else i++;//更小的话直接跳过下一个数 结束的时候还会再++一次}}out.println(ans);out.flush();}
}
博弈论 线性规划
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.ArrayList;public class Main{static BufferedReader in = new BufferedReader(new InputStreamReader(System.in));static PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));static int t;static int N = (int)1e5+6;static ArrayList<Integer> primes = new ArrayList<Integer>();static int[] is_p = new int[N];//0表示是质数 1表示不是质数static int[] sta = new int[N];//0表示先手必输 1表示先手必赢public static void judge_prime(int x) {is_p[0] = 1;is_p[1] = 1;//0和1都不是质数for(int i=2;i<=x;i++) {if(is_p[i]==0)primes.add(i);for(int prime:primes) {if(i*prime>x)break;//这一句一定要加否则会导致数组越界if(is_p[i*prime]==0)is_p[i*prime] = 1;//置为1if(i%prime==0)break;}}}public static boolean judge_index(int x) {return (x>=0&&x<N?true:false);}public static void main(String[] args)throws IOException{t = Integer.parseInt(in.readLine());judge_prime(N-2);//质数或者质数+1 是 先手必赢for(int prime:primes) {sta[prime] = 1;sta[prime+1] = 1;}for(int i=1;i<=1e5;i++) {//对于每一个木头的长度for(int prime:primes) {if(judge_index(i-prime)==false)continue;//不合法范围的话不行if(prime>i)break;if(sta[i-prime]==1)continue;//如果先手砍了一个之后是先手必赢 那么就是先手必输else {//只需要有一个能让先手必赢 那么就可以说这种情况先手必赢sta[i] = 1;break;}}}for(int i=1;i<=t;i++) {int len = Integer.parseInt(in.readLine());out.println(sta[len]);}out.flush();}
}