2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest
A
签到
I
题意:给你每个点之间的间隔,让你每次多选择一个点 ,使得距离最大
思路:每次选择现存的两个点之间距离最远的那个点,就可以了,答案一组一组输出。
E
题意:给一个n,让你求1~n之间并联电阻最小的。其中i的电阻表示1~i之间所有倒数的和,但如果是平方的那他的阻值就是0;
思路:用质数来组成一个数,那么他就是这个区间当中最小的,所以就进行一次筛法,筛出质数,然后再算出比他大的最小的那个数,然后所得到的值是有规律的,就是分子是前num个质数的积 ,分母是num个质数+1

import java.util.*; import java.math.BigInteger; public class Main { static int prime[]; static boolean vis[]; static final int maxn=1000; public static void main(String args[]) { prime=new int[maxn]; vis=new boolean[maxn]; int cnt=0; Scanner sc=new Scanner(System.in); for(int i=2;i<maxn;++i) { // if(!vis[i]) // { // prime[cnt++]=i; // for(int j=2;i*j<maxn;++j) // { // vis[i*j]=true; // } // } if(!vis[i]) prime[cnt++]=i; for(int j=0;j<cnt;++j) { int tmp=prime[j]*i; if(tmp>=maxn) break; vis[tmp]=true; if(i%prime[j]==0) break; } } //for(int i=0;i<cnt;++i) System.out.println(prime[i]); int t=sc.nextInt(); BigInteger a,b,c,g; while(true) { if(t==0) break; t--; BigInteger n=sc.nextBigInteger(); // System.out.println(ans+" "+n); //if(n==ans) System.out.println("true"); a=BigInteger.valueOf(1); int num=0; while(true) { a=a.multiply(BigInteger.valueOf(prime[num++])); if(a.compareTo(n)>0) break; } num--; b=BigInteger.valueOf(1); c=BigInteger.valueOf(1); for(int i=0;i<num;++i) { b=b.multiply(BigInteger.valueOf(prime[i])); c=c.multiply(BigInteger.valueOf(prime[i]+1)); } g=b.gcd(c); System.out.println(b.divide(g)+"/"+c.divide(g)); } } }
D
思路:参考博客:
https://blog.csdn.net/Tony5t4rk/article/details/85056360

#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<stack> #include<queue> #include<cstring> #include<string> #include<set> //#include<unordered_map> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,b,a) for(int i=b;i>=a;i--) #define m_p make_pair #define fi first #define se second #define pb push_back #define sz(x) (int)(x).size() #define pi acos(-1) #define IO ios::sync_with_stdio(false);cin.tie(0) #define io ios::sync_with_stdio(false) #define bug puts("---------bug----------") typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll>pll; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3f; const int eps=1e-9; inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline int lcm(int a,int b){return a*b/gcd(a,b);} inline int rd() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } // inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;} // inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();} const int maxn=1e5+50; int t; double a,b,r,d; int main() { //IO; t=rd(); while(t--) { //a=rd(),b=rd(),r=rd(),d=rd(); cin>>a>>b>>r>>d; double du=atan(1.0*b/(a+r))/acos(-1)*180; //cout<<du<<endl; //cout<<sin(30)<<endl; //cout<<sin(30*pi/180)<<endl; if(d-du>=eps) { printf("%.12lf\n",sqrt(b*b+(a+r)*(a+r))-r); }else { printf("%.12lf\n",r*cos(d*pi/180)+b*sin(d*pi/180)+a*cos(d*pi/180)-r); } } return 0; }
F
题意:给你个蜂巢,让你从S走到T,问最短的路径
思路:不能用getline,memset都会t,最短路和搜索都是可以做出来的,最短路的建图稍微麻烦一点

#include<cstdio> #include<cmath> #include<iostream> #include<algorithm> #include<vector> #include<map> #include<stack> #include<queue> #include<cstring> #include<string> #include<set> //#include<unordered_map> using namespace std; #define rep(i,a,b) for(int i=a;i<=b;i++) #define dep(i,b,a) for(int i=b;i>=a;i--) #define m_p make_pair #define fi first #define se second #define pb push_back #define sz(x) (int)(x).size() #define pi acos(-1) #define IO ios::sync_with_stdio(false);cin.tie(0) #define io ios::sync_with_stdio(false) #define bug puts("---------bug----------") typedef long long ll; typedef pair<int,int> pii; typedef pair<ll,ll>pll; const int inf=0x3f3f3f3f; const ll INF=0x3f3f3f3f3f3f3f3f; const int eps=1e-9; inline int gcd(int a,int b){return b?gcd(b,a%b):a;} inline int lcm(int a,int b){return a*b/gcd(a,b);} inline int rd() { int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9') { if(ch=='-') f=-1; ch=getchar();} while(ch>='0'&&ch<='9') { x=(x<<1)+(x<<3)+(ch^48); ch=getchar(); } return x*f; } // inline char nc() {static char buf[1000000],*p1=buf,*p2=buf;return p1==p2&&(p2=(p1=buf)+fread(buf,1,1000000,stdin),p1==p2)?EOF:*p1++;} // inline void read(int &sum) {char ch=nc();sum=0;while(!(ch>='0'&&ch<='9')) ch=nc();while(ch>='0'&&ch<='9') sum=(sum<<3)+(sum<<1)+(ch-48),ch=nc();} const int maxn=1e4+50; int t,r,c,stx,sty,edx,edy; char s[maxn][maxn]; int vis[maxn][maxn]; int dir[6][2]={{-1,3},{-1,-3},{1,3},{1,-3},{2,0},{-2,0}}; struct node { int x,y,step; node(){}; node(int x,int y,int step):x(x),y(y),step(step){}; }; void bfs() { queue<node>q; q.push(node(stx,sty,1)); vis[stx][sty]=1; int flag=0; while(!q.empty()) { node now=q.front();q.pop(); if(now.x==edx&&now.y==edy) { flag=1; printf("%d\n",now.step); break; } rep(i,0,5) { int nx=now.x+dir[i][0],ny=now.y+dir[i][1]; if(s[nx][ny]=='/'||s[nx][ny]=='\\'||s[nx][ny]=='-'||vis[nx+dir[i][0]][ny+dir[i][1]]) continue; node next;next.x=nx+dir[i][0],next.y=ny+dir[i][1],next.step=now.step+1; q.push(next); vis[next.x][next.y]=1; } } if(!flag) printf("-1\n"); } int main() { //IO; scanf("%d",&t); while(t--) { scanf("%d%d",&r,&c); getchar(); r=r*4+3,c=c*6+3; for(int i=0;i<r;++i) { //getline(cin,s[i]); gets(s[i]); //cout<<s[i]<<endl; for(int j=0;j<c;++j) { if(s[i][j]=='S') stx=i,sty=j; if(s[i][j]=='T') edx=i,edy=j; vis[i][j]=0; } } bfs(); } return 0; }