2014年百度之星程序设计大赛 - 资格赛

主要是卡了一下 接下来2题还在做 都有思路

1001

考虑完全就行了

#include <cstdio>
#include <cstring>
using namespace std;
int main()
{
	int T;
	scanf("%d", &T);
	while(T--)
	{
		__int64 n, m, v, k;
		scanf("%I64d %I64d %I64d %I64d", &n, &m, &v, &k);
		if(m >= n)
		{
			puts("0");
			continue;
		}
		if(k <= 1 || m <= v || (m-v)*k == m)
		{
			puts("-1");
			continue;
		}
		int sum = 0;
		while(m < n && m >= 0)
		{
			sum++;
			m = (m-v)*k;
		}
		if(m <= 0 && m < n)
			sum = -1;
		printf("%d\n", sum);
	}
	return 0;
}

1002

1003

这题错了半天 伤不起 转成字符串搞字典树就错 最后直接位运算&建树就对了

AC代码

#include <cstdio>
#include <cstring>
typedef __int64 LL;
const int maxn = 100010;
const int maxnode = 60000000;
const int sigma_size = 2;
LL a[maxn];
char s[maxn][70];
int ch[maxnode][sigma_size];
LL val[maxnode];
int sz;
void init()
{
	sz = 1;
	memset(ch[0], 0, sizeof(ch[0]));
}

void insert(LL v)
{
	int u = 0;
	for(int i = 31; i >= 0; i--)
	{
		int c = (v&(1<<i)) == 0 ? 0 : 1;
		if(!ch[u][c])
		{
			memset(ch[sz], 0, sizeof(ch[sz]));
			ch[u][c] = sz++;
		}
		u = ch[u][c];
	}
	val[u] = v;
}
void find(LL x)
{
	LL ans = 0;
	int u = 0;
	for(int i = 31; i >= 0; i--)
	{
		int c = (x&(1<<i)) == 0 ? 0 : 1;
		if(ch[u][c^1])
			u = ch[u][c^1];
		else
			u = ch[u][c];
	}
	printf("%I64d\n", val[u]);
}

int main()
{
	int cas = 1;
	int T;
	scanf("%d", &T);
	while(T--)
	{
		init();
		int n, m;
		scanf("%d %d", &n, &m);
		for(int i = 1; i <= n; i++)
		{
			scanf("%I64d", &a[i]);
			insert(a[i]);
		}
		printf("Case #%d:\n", cas++);
		while(m--)
		{
			LL x;
			scanf("%I64d", &x);
			find(x);
		}
	}
	return 0;
}

然后是错误代码

#include <cstdio>
#include <cstring>
const int maxn = 100010;
const int maxnode = 10000000;
const int sigma_size = 2;
__int64 a[maxn];
char s[maxn][70];
int ch[maxnode][sigma_size];
int val[maxnode];
int sz;
void init()
{
    sz = 1;
    memset(ch[0], 0, sizeof(ch[0]));
}

void insert(char *s, __int64 x)
{
    int u = 0, n = 60;
    for(int i = 0; i < 35; i++)
    {
        int c = s[i] - ‘0‘;
        if(!ch[u][c])
        {
            memset(ch[sz], 0, sizeof(ch[sz]));
            val[sz] = 0;
            ch[u][c] = sz++;
        }
        u = ch[u][c];
    }
    val[u] = x;
}
void find(char *s)
{
    __int64 ans = 0;
    int u = 0, n = 35;
    for(int i = 0; i < 35; i++)
    {
        int c = s[i] - ‘0‘;

        if(ch[u][c^1])
        {
            u = ch[u][c^1];
        }
        else
        {
            u = ch[u][c];
        }
    }

    printf("%I64d\n", val[u]);
}

int main()
{
    int cas = 1;
    int T;
    scanf("%d", &T);
    while(T--)
    {
        init();
        int n, m;
        scanf("%d %d", &n, &m);
        for(int i = 1; i <= n; i++)
        {
            scanf("%I64d", &a[i]);
            int x = 35;
            __int64 y = a[i];
            s[i][x] = 0;
            while(x--)
            {
                s[i][x] = y % 2 + ‘0‘;
                y /= 2;
            }
            insert(s[i], a[i]);
            //puts(s[i]);
        }
        printf("Case #%d:\n", cas++);
        while(m--)
        {
            __int64 y;
            char str[60];
            scanf("%I64d", &y);
            int x = 35;
            str[x] = 0;
            while(x--)
            {
                str[x] = y % 2 + ‘0‘;
                y /= 2;
            }
            //puts(str);
            find(str);
        }
    }
    return 0;
}

1004

2014年百度之星程序设计大赛 - 资格赛

时间: 2024-08-08 18:17:02

2014年百度之星程序设计大赛 - 资格赛的相关文章

2014年百度之星程序设计大赛 - 资格赛 1002 Disk Schedule(双调欧几里得旅行商问题)

Problem Description 有很多从磁盘读取数据的需求,包括顺序读取.随机读取.为了提高效率,需要人为安排磁盘读取.然而,在现实中,这种做法很复杂.我们考虑一个相对简单的场景.磁盘有许多轨道,每个轨道有许多扇区,用于存储数据.当我们想在特定扇区来读取数据时,磁头需要跳转到特定的轨道.具体扇区进行读取操作.为了简单,我们假设磁头可以在某个轨道顺时针或逆时针匀速旋转,旋转一周的时间是360个单位时间.磁头也可以随意移动到某个轨道进行读取,每跳转到一个相邻轨道的时间为400个单位时间,跳转

2014年百度之星程序设计大赛 - 资格赛 1004 -- Labyrinth

Labyrinth Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1453    Accepted Submission(s): 500 Problem Description 度度熊是一只喜欢探险的熊,一次偶然落进了一个m*n矩阵的迷宫,该迷宫只能从矩阵左上角第一个方格开始走,只有走到右上角的第一个格子才算走出迷宫,每一次只能走一格,

2014年百度之星程序设计大赛 - 资格赛 1001 Energy Conversion

Energy Conversion Problem Description 魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于读懂魔法文字的含义:石门里面有一个石盘,魔法师需要通过魔法将这个石盘旋转X度,以使上面的刻纹与天相对应,才能打开石门. 但是,旋转石盘需要N点能量值,而为了解读密文,百小度的能量值只剩M点了!破坏石门是不可能的,因为那将需要更多的能量.不过,幸运的是,作

2014年百度之星程序设计大赛 - 资格赛 1004 Labyrinth(Dp)

# -*- coding: utf-8 -*- """ Created on Fri May 16 17:24:05 2014 @author: lifeix """ #快速排序 import sys import random length = 30 def qsort(arr,left,right): lp = left rp = right if lp == rp:return while True: while arr[lp] >=

2014年百度之星程序设计大赛 资格赛第一题 (longlong)

解题思路: 只要看(A-V)*K 这个公式的更新值是否大于等于A ,大于的话继续循环,否则报错 注意一点,数据会爆int WA代码: #include<stdio.h> int main(){ long long n ,m, v, k; int t; scanf("%d",&t); while(t--){ scanf("%lld%lld%lld%lld",&n,&m,&v,&k); int cnt = 0; whi

hdu 4825 Xor Sum (建树) 2014年百度之星程序设计大赛 - 资格赛 1003

题目 题意:给n个数,m次询问,每次给一个数,求这n个数里与这个数 异或 最大的数. 思路:建一个类似字典数的数,把每一个数用 32位的0或者1 表示,查找从高位向底位找,优先找不同的,如果没有不同的,就找相同的. 1 #include <iostream> 2 #include <cstdio> 3 #include <cstring> 4 #include <algorithm> 5 using namespace std; 6 #define LL l

2014年百度之星程序设计大赛 - 资格赛 第一题 Energy Conversion

Problem Description   魔法师百小度也有遇到难题的时候-- 现在,百小度正在一个古老的石门面前,石门上有一段古老的魔法文字,读懂这种魔法文字需要耗费大量的能量和大量的脑力. 过了许久,百小度终于读懂魔法文字的含义:石门里面有一个石盘,魔法师需要通过魔法将这个石盘旋转X度,以使上面的刻纹与天相对应,才能打开石门. 但是,旋转石盘需要N点能量值,而为了解读密文,百小度的能量值只剩M点了!破坏石门是不可能的,因为那将需要更多的能量.不过,幸运的是,作为魔法师的百小度可以耗费V点能量

2014年百度之星程序设计大赛 - 初赛(第一轮) hdu Grids (卡特兰数 大数除法取余 扩展gcd)

题目链接 分析:打表以后就能发现时卡特兰数, 但是有除法取余. f[i] = f[i-1]*(4*i - 2)/(i+1); 看了一下网上的题解,照着题解写了下面的代码,不过还是不明白,为什么用扩展gcd, 不是用逆元吗.. 网上还有别人的解释,没看懂,贴一下: (a / b) % m = ( a % (m*b)) / b 笔者注:鉴于ACM题目特别喜欢M=1000000007,为质数: 当gcd(b,m) = 1, 有性质: (a/b)%m = (a*b^-1)%m, 其中b^-1是b模m的逆

2014年百度之星程序设计大赛 - 初赛(第二轮)

1001 暴力 #include <cstdio> #include <algorithm> #include <cstring> using namespace std; const int maxn = 100100; int ll[maxn], rr[maxn]; struct node { int x, y, bj; }e[maxn]; int main() { int cas = 1; int T; scanf("%d", &T);