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));


        }
    }

}
View Code

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;
}
View Code

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;
}
View Code

 

posted @ 2020-11-22 19:50  passawayy  阅读(153)  评论(0)    收藏  举报