20182019 ACMICPC, Asia Jiaozuo Regional Contest

2018-2019 ACM-ICPC, Asia Jiaozuo Regional Contest

A. Xu Xiake in Henan Province

签到

D. Keiichi Tsuchiya the Drift King

几何,队友过的,好像说用三角函数会卡精度?

#include <bits/stdc++.h>

using namespace std;

const long double pi=acos(-1.0);

int main()
{
    int _;
    scanf("%d",&_);
    while(_--){
        long double a, b, r, d;
        scanf("%Lf %Lf %Lf %Lf",&a,&b,&r,&d);
//        long double angle=atan2(a+r, b) * 180.0 / pi;
        long double res;
        if(d>=90) res=sqrt((r+a)*(r+a) + b*b)-r;
        else{
            long double ss=tan(d*pi/180);
            long double tmp=b/(a+r);
//            printf("ss=%Lf tmp=%Lf\n", ss, tmp);
            if(ss>=tmp) res=sqrt((r+a)*(r+a) + b*b)-r;//
            else{
//                long double ss=tan(d*pi/180.0);
    //            printf("ss=%Lf %lf\n", ss, sqrt(3.0)/3);//
                long double cg, ca, gd, fd, ad;
                ca=r+a;
                cg=ca*ss;
                gd=b-cg;
                long double zz=(ca*ca)*(gd*gd)/((ca*ca)+(cg*cg));
                res=sqrt(ca*ca+b*b-zz)-r;
            }
        }
        printf("%.12Lf\n", max(res, a));
    }
    return 0;
}

E. Resistors in Parallel

打表找规律,分子是质数相乘,分母是分子+1相乘,python大数,我把//当成/了,wa(演)飞了~

import math
def init(n: int):
    prime = []
    vis = [0] * (n+1)
    cnt = 0
    for i in range(2, n + 1):
        if vis[i] == 0:
            prime.append(i)
            cnt = cnt + 1
        j = 0
        while (j < cnt and prime[j] * i <= n ):
            vis[i * prime[j]] = 1
            if (i % prime[j] == 0):
                break
            j = j + 1
    return prime
ret = init(100000)
_ = int(input())
for t in range(0,_) :
	n = int(input())
	son = int(1)
	mo = int(1)
	for i in ret :
		if son * i > n :
			break
		son = son * i
		mo = mo * (i+1)
	d = math.gcd(son, mo)
	son //= d
	mo //= d

	print("%i/%i"%(son,mo))
 

F. Honeycomb

这题纯bfs迷宫裸题啊。。。,格子数清楚同时读入的时候不能getline,会T

#include <bits/stdc++.h>

using namespace std;
#define ll long long
const int N=1e6+10;

int n,m;
char s[10000][10000];
int len[N];
bool vis[5000][7000];

struct Node{
    int x,y;
    int cnt;
}e;

int main(){
    int _;
    cin>>_;
    while(_--){
        cin>>n>>m;
        getchar();
        int cnt=0;
        for(int i=1;i<=4*n+3;++i){
            cnt=0;
            while(char c=getchar()){
                if(c=='\n') break;
                s[i][++cnt]=c;
            }
            len[i]=cnt;
        }
        int sx,sy,ex,ey;
        for(int i=1;i<=4*n+3;++i){
            for(int j=1;j<=len[i];++j){
                vis[i][j]=false;
                if(s[i][j]=='S'){
                    sx=i,sy=j;
                }
                if(s[i][j]=='T'){
                    ex=i,ey=j;
                }
            }
        }
        queue<Node> q;
        q.push({sx,sy,1});
        int ans=-1;
        while(!q.empty()){
            auto tmp=q.front();
            q.pop();
            
            int x=tmp.x,y=tmp.y;
            int cnt=tmp.cnt;
            
            if(x==ex && y==ey){
                ans=cnt;
                break;
            }
      
            if(vis[x][y]) continue;
            vis[x][y]=true;
   
            bool flag=true;
            if(s[x-2][y]!=' ') flag=false;
            if(flag) q.push({x-4,y,cnt+1});
   
            flag=true;
            if(s[x+2][y]!=' ') flag=false;
            if(flag) q.push({x+4,y,cnt+1});

            flag=true;
            if(s[x-1][y-3]!=' ') flag=false;
            if(flag) q.push({x-2,y-6,cnt+1});

            flag=true;
            if(s[x+1][y-3]!=' ') flag=false;
            if(flag) q.push({x+2,y-6,cnt+1});

            flag=true;
            if(s[x-1][y+3]!=' ') flag=false;
            if(flag) q.push({x-2,y+6,cnt+1});

            flag=true;
            if(s[x+1][y+3]!=' ') flag=false;
            if(flag) q.push({x+2,y+6,cnt+1});
        }
        printf("%d\n",ans);
    }
    return 0;
}

I. Distance

先将每个点坐标求出来,不难发现,每次选左右两边的距离一定最大,记前缀后缀和,输出答案即可

#include <bits/stdc++.h>

using namespace std;
#define ll long long
const int N=1e6+10;
int n;
ll a[N],b[N];
ll pre[N],suf[N];

int main(){
    int _;
    scanf("%d",&_);
    while(_--){
        scanf("%d",&n);
        for(int i=2;i<=n;++i){
            scanf("%lld",&a[i]);
        }
        b[1]=0;
        for(int i=2;i<=n;++i){
            b[i]=b[i-1]+a[i];
        }
        pre[0]=0;
        for(int i=1;i<=n;++i){
            pre[i]=pre[i-1]+b[i];
        }
        suf[n+1]=0;
        for(int i=n;i>=1;--i){
            suf[i]=suf[i+1]+b[i];
        }
        int l=1,r=n;
        int f=0;
        ll ans=0;
        while(l<=r){
            if(!f){
                ans+=abs((l-1)*b[l]-pre[l-1])+abs(suf[r+1]-(n-r)*b[l]);
                printf("%lld",ans);
                l++;
                f^=1;
            }
            else{
                ans+=abs((l-1)*b[r]-pre[l-1])+abs(suf[r+1]-(n-r)*b[r]);
                printf("%lld",ans);
                r--;
                f^=1;
            }
            if(l<=r) printf(" ");
        }
        puts("");
    }

    return 0;
}
原文地址:https://www.cnblogs.com/lr599909928/p/15602069.html