计蒜之道 测试赛 (BCD)

测试赛写写题解不会被吐槽吧。。。


淘汰赛车

时限:1000ms

内存:262144K

赛车比赛在潘多拉星球变得越来越流行了。但是他们的比赛跟我们平常的不太一样:n 辆赛车在一条长长的直道上展开同台竞技。每辆赛车的速度都为 1m/s,整条赛道在每一米都有坐标标记。

在比赛的赛车中,赛车 i 从 0 秒开始由 ai 向 bi 移动。到达 bi 之后转而返回由 bi 向 ai 移动。循环往复。

又是蒜头菌!原来这是蒜头菌正在玩的一个手机小游戏。蒜头菌可以在某些位置放下 TNT 炸毁某些赛车。因为他有 m 个问题。其中,问题 j 是:在 tj 时刻,在 xi 到 yi 之间共有几辆赛车?

你的任务就是回答萌蒜头的问题。

输入

输入的第一行包含两个数字 n 和 m(1 ≤ n, m ≤ 1000),分别代表正在比赛的赛车数量和蒜头的问题数。

接下来的 n 行中,每行包含 2 个整数 ai、bi(0 ≤ ai, bi ≤ 109, ai != bi),分别代表赛车 i 的起点和终点。

再接下来的 m 行中,每行包含 3 个整数 xj,yj,tj(0 ≤ xj ≤ yj ≤ 109, 0 ≤ tj ≤ 109),分别代表问题 j 的左右坐标边界和询问的时间。

输出

输出共有 m 行,每行各有一个整数,分别代表对应的 m 个问题的答案。

样例1

输入:

5 5
0 1
0 2
2 3
3 5
4 5
0 5 0
0 1 2
0 2 1
2 5 2
2 5 3

输出:

5
1
2
4
3

题目分析:其实是个大水题啊,主要是自己太sb了,一开始没好好分析,因为车子是来回开,m和n又都是1e3,所以直接在线求解,对每个跑道的赛车求出t时刻的位置,判断在不在目标区间内,求的方法就是每类取模


#include <cstdio>
#include <cstring>
int const MAX = 1005;
int a[MAX], b[MAX];

int main()
{
    int n, m;
    while(scanf("%d %d", &n, &m) != EOF)
    {
        for(int i = 0; i < n; i++)
            scanf("%d %d", &a[i], &b[i]);
        while(m--)
        {
            int x, y, t;
            scanf("%d %d %d", &x, &y, &t);
            int ans = 0;
            for(int i = 0; i < n; i++)
            {
                int tmp, dis = b[i] - a[i];
                if((t / dis) % 2 == 0)
                    tmp = a[i] + (t % dis);
                else
                    tmp = b[i] - (t % dis);
                if(tmp <= y && tmp >= x)
                    ans ++;
            }
            printf("%d\n", ans);
        }
    }
}



置换的玩笑

时限:1000ms

内存:262144K

小蒜头又调皮了。这一次,姐姐的实验报告惨遭毒手。

姐姐的实验报告上原本记录着从 1 到 n 的序列,任意两个数字间用空格间隔。但是“坑姐”的蒜头居然把数字间的空格都给删掉了,整个数字序列变成一个长度为 1 到 100 的且首部没有空格的数字串。

现在姐姐已经怒了,蒜头找你写个程序快点把试验数据复原。

输入

输入文件有一行,为一个字符串——被蒜头搞乱的实验数据。

字符串的长度在 1 到 100 之间。

输出

输出共一行,为姐姐的原始测试数据—— 1 到 n 的输出。

任意两个数据之间有一个空格。

样例1

输入:

4111109876532

输出:

4 1 11 10 9 8 7 6 5 3 2

题目分析:首先我们通过字符串长度可以计算出n的值,当len <= 9时,n=len,否则n = 9 + (len - 9) / 2,然后就是DFS搜了,各种剪,直接看程序吧

#include <cstdio>
#include <cstring>
char s[105];
int num[100];
int len, n;
bool flag, vis[100];

bool ok()	//判断是否合法
{
	bool has[100];
	memset(has, false, sizeof(has));
	for(int i = 0; i < n; i++)
		has[num[i]] = true;
	for(int i = 1; i <= n; i++)
		if(!has[i])
			return false;
	return true;
}

void DFS(int idx, int cnt) //下标到idx,得到cnt个数
{
	if(cnt + len - idx < n)	//如果剩下字符串的长度不能得到n个数则返回
		return;
	if(flag)	//找到可行解则返回
		return;
	if(idx >= len)	//搜到最后判断并返回
	{
		if(cnt == n && ok())
			flag = true;
		return;
	}
	num[cnt] = s[idx] - '0'; //个位数
	if(!vis[num[cnt]])	//当前数字没有被得到则记录下来并继续搜索
	{
		vis[num[cnt]] = true;
		DFS(idx + 1, cnt + 1);
		if(flag)
			return;
		vis[num[cnt]] = false;
	}
	if(idx < len - 1)
	{
		num[cnt] = 10 * (s[idx] - '0') + s[idx + 1] - '0'; //十位数
		if(num[cnt] <= n && num[cnt] > 9)
		{
			if(!vis[num[cnt]])
			{
				DFS(idx + 2, cnt + 1);
				if(flag)
					return;
				vis[num[cnt]] = false;
			}
		}
	}
	return;
}

int main()
{
	while(scanf("%s", s) != EOF)
	{
		flag = false;
		memset(vis, false, sizeof(vis));
		memset(num, 0, sizeof(num));
		len = strlen(s);
		if(len > 9)
			n = 9 + (len - 9) / 2;
		else
			n = len;
		DFS(0, 0);
		for(int i = 0; i < n - 1; i++)
			printf("%d ", num[i]);
		printf("%d\n", num[n - 1]);
	}
}



作弊揭发者

时限:1000ms

内存:65536K

鉴于我市拥堵的交通状况,市政交管部门经过听证决定在道路两侧安置自动停车收费系统。当车辆驶入车位,系统会通过配有的摄像头拍摄车辆画面,通过识别车牌上的数字、字母序列识别车牌,通过连接车管所车辆信息数据库确认车辆,进行扣费。

斗智斗勇的好戏一般从此处展开…

一些车主通过在停车时遮挡车牌上的一个或多个数字、字母序列,来阻碍识别系统的识别工作,以此逃避停车费用的缴纳。

车主这简直是用轻轻的一挡搞出来一个世界难题有木有?!管理是一方面,技术解决才是王道啊。

这么难的项目不得不交给计蒜客实验室了。D 神负责识别颜色,E 神负责型号识别,可能的车牌范围就这么一点点的被缩小了。作为实习生的蒜头也是任务艰巨,将已经存在车辆数据库中的可与当前已知信息相匹配的车牌信息筛选出来,这可是整个项目的第一步啊,重要性我就不多说了,加油吧。

输入

输入文件的第一行包含 9 个字符的字符序列代表识别的。

其中可识别的字符已由大写字母和数字显示,“*”表示因为遮挡而未被识别的字符。

输入文件的第二行包含一个整数 n (1 ≤ n ≤ 1000) —— 机动车数据库中的牌照信息的数量。

接下来 n 行,包含相应的牌照信息,每行一个。

牌照信息为长度为 9 的仅包含数字和大写字母的字符串。所有的牌照信息保证各不相同。

输出

输出文件的第一行为一个整数 k (0 ≤ k ≤ n) —— 符合给定要求的牌照数。

接下来的 k 行,输出所有可能的牌照信息。

样例1

输入:

A**1MP19*
4
A001MP199
E885EE098
A111MP199
KT7351TTB

输出:

2
A001MP199
A111MP199

题目分析:小模拟,直接搞

#include <cstdio>
#include <cstring>
char s[1005][10], re[1005][10];

int main()
{
    char t[10];
    while(scanf("%s", t) != EOF)
    {
        memset(re, 0, sizeof(re));
        int n;
        scanf("%d", &n);
        for(int i = 0; i < n; i++)
            scanf("%s", s[i]);
        int ans = 0;
        for(int i = 0; i < n; i++)
        {
            int j;
            for(j = 0; j < 9; j++)
            {
                if(t[j] == '*')
                    continue;
                if(t[j] != s[i][j])
                    break;
            }
            if(j == 9)
                strcpy(re[ans ++], s[i]);
        }
        printf("%d\n", ans);
        for(int i = 0; i < ans; i++)
            printf("%s\n", re[i]);
    }
}



  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 6
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 6
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值