新手,欢迎交流,持续更新。
A. 结果填空:有趣的数字
原题链接:传送门
思路:
- 先把素数筛选出来,然后一个一个判断是不是含有5 。
- 答案是3282 。
代码如下:
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
boolean vis[]=new boolean[100001];
int prime[]=new int[100001];
vis[1]=vis[0]=true;
int index=0;
for(int i=2;i<=100000;i++)
if(!vis[i]) {
prime[index++]=i;
for(int j=i*2;j<=100000;j+=i)
vis[j]=true;
}
int ans=0;
for(int i=0;i<index;i++)
{
while(prime[i]>0) {
int x=prime[i]%10;
prime[i]/=10;
if(x==5) {
ans++;
break;
}
}
}
System.out.println(ans);
}
}
B. 结果填空:爬楼梯
原题链接:传送门
思路:
- 简单的dp,不会的可以推荐做硬币分配问题 。
- 答案是72 。
代码如下:
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int dp[]=new int[11];
dp[0]=1;
for(int i=1;i<=10;i++)
{
for(int j=1;j<=4;j++)
if(j<=i) {
dp[5]=dp[7]=0;
dp[i]+=dp[i-j];
}
}
for(int i=1;i<=10;i++)
System.out.println(dp[i]);
}
}
C. 结果填空:七巧板
原题链接:传送门
思路:
- 跟平面划分一个道理,每次都会多划分一个区域,F(n)=F(n-1)+1 。
- 答案是47 。 = 7+ (6+7+8+9+10)
- 模拟题那个答案是42,但正确答案是47 。
代码如下:
import java.util.Deque;
import java.util.LinkedList;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int x=7,a=5;
for(int i=1;i<=5;i++)
x+=a++;
System.out.println(x);
}
}
F. 程序设计:寻找重复项
原题链接:传送门
思路:
- 下午没用long,题意也理解错,越界情况是下标超过2e6,我写成x超过2e6,只过了40%。
- 结束后发现脑瘫行为改了之后只过90%。
- 再改了一次,代码注释处,粗心,没有初始化完整,AC 100%。
代码如下:
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
long a=cin.nextLong(),b=cin.nextLong(),c=cin.nextLong();
long x=1;
HashMap<Long,Long>mp = new HashMap<Long,Long>();
mp.put(x,(long) 1); //忘记把1塞进去了 无奈....一直卡在%90
for(int i=1;i<=2000000;i++) {
x=(x*a+x%b)%c;
mp.put(x, mp.get(x)==null?1:mp.get(x)+1);
if(mp.get(x)>1) {
System.out.println(i);
return ;
}
}
System.out.println("-1");
}
}
H. 程序设计:字符串
原题链接:传送门
思路:
- 注意看题意,先判断原串是不是mod的倍数。
- 再判断能不能交换一次实现 整个串的数值是mod的倍数。
- 实在不行再输出-1 -1 。
- 下午做题没注意,直接按第二种情况处理,结果没AC,结束后改了一些A过。
代码如下:
import java.util.Deque;
import java.util.HashMap;
import java.util.LinkedList;
import java.util.Map;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
static int a[] =new int[2005];
static int mod;
public static int gets(String s) {
int ans=0;
int n=s.length();
for(int i=0;i<n;i++) {
ans=ans*26+s.charAt(i)-'A';
ans%=mod;
}
return ans;
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
String s=cin.next();
mod=cin.nextInt();
int n=s.length();
// System.out.println(n);
int ans=gets(s);
if(ans==0) {
System.out.println("0 0");
return ;
}
a[n-1]=1;
for(int i=n-2;i>=0;i--) {
a[i]=26*a[i+1]%mod;
//System.out.println(a[i]);
}
for(int i=0;i<n;i++)
for(int j=i+1;j<n;j++)
{
int res=(s.charAt(i)-s.charAt(j))*a[j]+
(s.charAt(j)-s.charAt(i))*a[i];
if( (res+ans+mod)%mod==0) {
System.out.println(++i +" "+ ++j);
return ;
}
}
System.out.println("-1 -1");
}
}
I. 程序设计:最短路
原题链接:传送门
思路:
- 下午只建了一张图,过了%40 。
- 正反向建图跑一遍,目前过50% 。
代码如下:
import java.util.ArrayDeque;
import java.util.Deque;
import java.util.PriorityQueue;
import java.util.Queue;
import java.util.Scanner;
import java.util.concurrent.LinkedBlockingDeque;
public class Main {
static class Edge{
int v,w,next;
Edge(int v,int w,int next){
this.v=v;
this.w=w;
this.next=next;
}
}
static int manx=1000000+5;
static int mamx=manx;
static int head[][]=new int[2][manx];
static long d[][]=new long[2][manx];
static boolean vis[]=new boolean[manx];
static Edge a[][] = new Edge[2][mamx];
static int cnt[] = new int[manx];
static int n,m,s,k0=0,k1=0;
static void add(int i,int u,int v, int w)
{
int k;
if(i==0) k=k0;
else k=k1;
Edge x=new Edge(v,w,head[i][u]);
a[i][++k]=x;
head[i][u]=k;
if(i==0) k0=k;
else k1=k;
}
static void dij(int x){
for(int i=1;i<=n;i++) {
d[x][i]=(long) 1e9;
vis[i]=false;
}
Deque<Integer> q=new ArrayDeque<Integer>();
q.add(s);
d[x][s]=0;
vis[s]=true;
while(!q.isEmpty()){
int u=q.poll();
vis[u]=false;
for(int i=head[x][u];i>0;i=a[x][i].next){
int v=a[x][i].v;
int w=a[x][i].w;
if(d[x][v]>d[x][u]+w){
d[x][v]=d[x][u]+w;
if(!vis[v]) {
vis[v]=true;
if(!q.isEmpty()&&d[x][v]>=d[x][q.peek()]) q.addLast(v);
else q.addFirst(v);
}
}
}
}
}
public static void main(String[] args) {
Scanner cin=new Scanner(System.in);
int t=cin.nextInt();
while(t-->0) {
n=cin.nextInt();
m=cin.nextInt();
k0=0;
k1=0;
s=1;
for(int i=1;i<=n;i++) {
head[0][i]=0;
head[1][i]=0;
}
while(m-->0){
int u=cin.nextInt();
int v=cin.nextInt();
int w=cin.nextInt();
add(0,u,v,w);
add(1,v,u,w);
}
dij(0);
dij(1);
long ans=0;
for(int i=2;i<=n;i++)
ans+=d[1][i]+d[0][i];
System.out.println(ans);
}
}
}