第十一届蓝桥杯 b组
答案:3880
代码:
package 第十一届蓝桥杯;
public class Main01 {
public static void main(String[] args) {
int t = 10000;
int time = 0;
boolean b = true;
boolean flag = true;
while(flag) {
for(int i=0;i<60;i++) {
if(b) {
t-=10;
time++;
}else {
t+=5;
time++;
}
if(t<=0) {
flag = false;
break;
}
}
if(b) {
b = false;
}else {
b = true;
}
}
System.out.println(time);
}
}
答案:52038720
代码:
package 第十一届蓝桥杯;
import java.text.ParseException;
import java.text.SimpleDateFormat;
import java.util.Date;
public class Main02 {
public static void main(String[] args) throws ParseException {
SimpleDateFormat s = new SimpleDateFormat("yyyy-MM-dd HH-mm-ss");
Date d1 = s.parse("1921-7-23 12-00-00");
Date d2 = s.parse("2020-7-1 12-00-00");
long t1 = d2.getTime()-d1.getTime();
System.out.println(t1/60000);
}
}
答案:10
代码:
package 第十一届蓝桥杯;
public class Main03 {
public static void main(String[] args) {
//我们假设一共有100人 其中有一人被感染
int k = 0;
int s = 1000;
int t = 0;
for(int i=1;i<=100;i++) { //假设每组i个人
if(100%i==0) {
t = i +100/i;
}else {
t = 100/i+1+i;
}
if(t<s) {
k = i;
s = t;
}
}
System.out.println(k);
}
}
代码:
package 第十一届蓝桥杯;
import java.util.Scanner;
public class Main06 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
long n = sc.nextLong();
while(n>0) {
System.out.print(n+" ");
n/=2;
}
}
}
代码:
package 第十一届蓝桥杯;
import java.util.Scanner;
public class Main07 {
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
char[] ch = sc.next().toCharArray();
for(int i=0;i<ch.length;i++) {
if(ch[i]>='a'&&ch[i]<='z'||ch[i]>='A'&&ch[i]<='Z') {
if(i+1<ch.length&&ch[i+1]>='0'&&ch[i+1]<='9') {
int t = ch[i+1]-'0';
for(int k=0;k<t;k++) {
System.out.print(ch[i]);
}
if(i+1<ch.length) {
i++;
}
}else {
System.out.print(ch[i]);
}
}
}
}
}
思路:爆搜会超时,可以采用记忆化搜索或者dp。三种方法全部贴上了
代码:
package 第十一届蓝桥杯;
import java.util.Scanner;
public class Main08 {
static int n,m,ans;
static int[][] book = new int[31][31];
static int[][] dp = new int[31][31];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = sc.nextInt();
m = sc.nextInt();
dfs(1,1);
System.out.println(ans);
if(!(n%2==0&&m%2==0)) {
book[n][m]=1;
}
System.out.println(dfs01(1,1));
for(int i=1;i<=n;i++) {
dp[i][1]=1;
}
for(int i=1;i<=m;i++) {
dp[1][i]=1;
}
for(int i=2;i<=n;i++) {
for(int j=2;j<=m;j++) {
if(!(i%2==0&&j%2==0)) {
dp[i][j]=dp[i-1][j]+dp[i][j-1];
}
}
}
System.out.println(dp[n][m]);
}
public static int dfs01(int x,int y) { //记忆化搜索可以ac
if((x&1)==1||(y&1)==1) {
if(book[x][y]>0) return book[x][y];
if(x<n) book[x][y]+=dfs01(x+1,y);
if(y<m) book[x][y]+=dfs01(x,y+1);
}
return book[x][y];
}
public static void dfs(int x,int y) { //爆搜超时
if(x==n&&y==m) {
ans++;
return ;
}
int tx,ty;
tx=x;
ty=y+1;
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&!(tx%2==0&&ty%2==0)) {
dfs(tx,ty);
}
tx=x+1;
ty=y;
if(tx>=1&&ty>=1&&tx<=n&&ty<=m&&!(tx%2==0&&ty%2==0)) {
dfs(tx,ty);
}
}
}
思路:
看一下n的范围,10的5次方 ,暴力会超时,我们考虑进行优化。
分析题意 : a[i]乘以10的length(a[j]+”“)次方+a[j]是k的倍数 , 即(a[i]*10的length(a[j]+”“)%k + a[j]%k )%k=0 , 考虑到这里 此题就结束了
代码:
package 第十一届蓝桥杯;
import java.util.Scanner;
public class Main09 {
static int n,k;
static long ans;
static long[] arr ;
static int[][] book = new int[11][100005];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
n = (int) sc.nextLong();
k = (int) sc.nextLong();
arr = new long[n];
for(int i=0;i<n;i++) {
arr[i] = sc.nextLong();
for(int j=1;j<=10;j++) {
int t =(int) (arr[i]* Math.pow(10, j)%k);
book[j][t]++;
}
}
for(int i=0;i<n;i++) {
int len =(arr[i]+"").length();
int t = (int) (arr[i]%k);
int tt = (int) (arr[i]* Math.pow(10, len)%k);
if(t==0) {
if(tt!=0) {
ans+=book[len][0];
}else {
ans+=book[len][0]-1;
}
}else {
if(tt+t!=k) {
ans+=book[len][k-t];
}else {
ans+=book[len][tt]-1;
}
}
}
System.out.println(ans);
}
}