2018icpc南京

  • Post author:
  • Post category:其他



A. Adrien and Austin

theme:一堆石子,编号从1~n,两个人轮流操作,每次可以取出1~k个编号连续的石子,问先手赢还是后手?1<=n,k<=1e6

solution:分析怎样的情况会赢,首先如果k>1则无论n是奇数还是偶数,先手取一次都可以分成两段长度相等的连续的段,这时候无论后手怎么操作,先手再在另一堆做对应的操作即可,所以先手必胜。当k==1时,如果n为奇数还是可以分成相等的两段,所以先手必胜,而n是偶数的时候,不能分成相等的两段,且先手 会输。注意特判下0==n,它不受k影响。

#include<bits/stdc++.h>
using namespace std;
#define far(i,t,n) for(int i=t;i<n;++i)
#define pk(a) push_back(a)
#define lowbit(x) x&(-x)
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
int inf=0x3f3f3f3f;
int mod=1e9+7;
const int maxn=1010;

int main()
{
    int n,k;
    cin>>n>>k;
    if(!n)
        puts("Austin");
    else
    {
        if(1==k)
        {
            if(n&1)
                puts("Adrien");
            else
                puts("Austin");
        }
        else
            puts("Adrien");
    }
}

**

D – Country Meow

theme:给定三维空间中n个点的坐标,在空间中找到一个到这n个点的最大距离最小的点,求这个最小的最大距离。1 ≤ N ≤ 100,−100000 ≤ xi , yi , zi ≤ 100000

solution:最大值最小化,考虑优化算法。这题是典型的最小球覆盖问题,考虑模拟退火解。

#include<bits/stdc++.h>

using namespace std;

const int MAXN=105;
const double EPS=1e-8;
struct Point{
    double x,y,cur;
}Dots[MAXN];
int n;

double Distance(Point a,Point b){
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y)+(a.cur-b.cur)*(a.cur-b.cur));
}

double Solve(){
    double Step=200,ans=1e9,dis;
    Point cur=Point{0,0,0};
    int far=0;//far为离所选点最远的点
    while(Step>EPS){
        for(int i=1;i<=n;i++)
            if(Distance(cur,Dots[far])<Distance(cur,Dots[i]))
                far=i;
        dis=Distance(cur,Dots[far]);
        ans=min(ans,dis);
        cur.x+=(Dots[far].x-cur.x)/dis*Step;
        cur.y+=(Dots[far].y-cur.y)/dis*Step;
        cur.cur+=(Dots[far].cur-cur.cur)/dis*Step;
        Step*=0.9999;
    }
    return ans;
}

int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++){
        double x,y,cur;
        scanf("%lf %lf %lf",&x,&y,&cur);
        Dots[i]=Point{x,y,cur};
    }
    printf("%.7f\n",Solve());
}

**

K、Kangaroo Puzzle

theme:给定n个长度为m的01串,0表示障碍物,初始时1的位置都有一个袋鼠,袋鼠可以上下左右移动,每次移动所有袋鼠一起进行,如果某只袋鼠无法移动则它待在原地,问怎样安排移动方向使得最终所有袋鼠都在一个格子上。保证每只袋鼠能移动到任何不是0的位置上,且不存在袋鼠围成一个圈的情况,问能否在50000步内实现。1 ≤ n, m ≤ 20,输出方向

solution:首先由题意可知袋鼠初始所在位置是连通的,所以一定可以实现所有袋鼠都跳到一格。只要每次找两只在不同位置的袋鼠使它两合并即可。所以最多移动20*20*40=16000步,而题目要求是50000步内,所以随机走50000步也过了。

#include<bits/stdc++.h>
using namespace std;
 
int main()
{
	srand(time(0));
	char t[]={'U','D','L','R'};
	for (int i=0;i<50000;i++) putchar(t[rand()&3]);
	puts("");
}



版权声明:本文为wangqianqianya原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。