计蒜之道 测试赛

题目链接:http://www.jisuanke.com/minicourse/63

绿色能源

蒜头又要改变世界了。这次他将为一些恶劣地形环境设计太阳能取电方案。

在最新的设计中,太阳能板被设置在一些太阳能塔上,与塔同高。

这一次,将有 n 座太阳能塔被设置,这些塔已经被提前制作完成,其中 i 号塔高为 hi,现在工程师需要确定将塔安置在哪些位置,以获得最大的总能量。

太阳能塔被安置的地形环境由 m 个点的多边形来表示。多边形的每个点将会给出对应的坐标(xi, yi),xi < xi+1

经过测量可知,太阳在此地的照射角度恒为 α 度。太阳的阳光洒满在最左上角到最右下角的区域。获取的太阳能的多少取决于被太阳光照射的塔的长度。

当两座塔被安置的较近时,左边的塔的影子会落在右边的塔上,这样右边的塔产生的能量就会有一定程度的减少。同理,周围起伏的地形也会对太阳能塔有一些遮挡,从而使获取的能量有所减少。

<IMG style="BOX-SIZING: border-box; MAX-WIDTH: 100%; BORDER-TOP: 0px; HEIGHT: auto; BORDER-RIGHT: 0px; VERTICAL-ALIGN: middle; BORDER-BOTTOM: 0px; MARGIN: auto; BORDER-LEFT: 0px; DISPLAY: block" src="http://res.jisuanke.com/img/nanti/419.png" a="" <="">

你的任务是设计太阳能塔的安置位置方案,使得所有太阳能塔获得尽可能多的能量。

输入

输入文件的第一行包含三个整数 n, m, α(1 ≤ n ≤ 104, 2 ≤ m ≤ 104, 1 ≤ α < 90)。

第二行包含 n 个整数 hi, 为塔的高度(1 ≤ hi ≤ 103)。

接下来的 m 行为 xi,yi 对,为地形的顶点坐标(|xi| ≤ 105, xi < xi+1, |yi| ≤ 103)。

输出

输出文件的第一行为最大的可能获得的太阳能量值,绝对误差不超过 10-6

接下来的 n 行输出太阳能塔安置位置的 x 点坐标,绝对误差不超过 10-9

太阳能塔的坐标的输出顺序请与输入顺序保持一致。

如果有多种使得总能量值最大的方案,输出任意一种即可。

样例1

输入:

5 4 1020 10 20 15 100 1040 2050 070 30

输出:

52.34288864959254516.00.070.065.365.3

 

每次数学题都有点麻烦的说。有时间再写;

转载请注明出处:寻找&星空の孩子

 

淘汰赛车

赛车比赛在潘多拉星球变得越来越流行了。但是他们的比赛跟我们平常的不太一样: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

 

算出每个状态(时间点)车停的位置就好了(注意起始方向)

转载请注明出处:寻找&星空の孩子

#include<stdio.h>
#define LL long long
struct car
{
    LL a;
    LL b;
} num[1005];
LL ffabs(LL x)
{
    if(x<0)return -x;
    else return x;
}
int main()
{
    LL n,m;
    LL x,y,t;
    scanf("%lld%lld",&n,&m);
    for(int i=0; i<n; i++)
    {
        scanf("%lld%lld",&num[i].a,&num[i].b);
    }
    for(int i=0; i<m; i++)
    {
        scanf("%lld%lld%lld",&x,&y,&t);
        LL ca=0;
        for(int j=0; j<n; j++)
        {
            if(num[j].a<num[j].b)
            {
                if(num[j].a>y||num[j].b<x) continue;
                if(num[j].a>=x&&num[j].b<=y)
                {
                    ca++;
                    continue;
                }
                else
                {
                    LL sum=-1;
                    if(t==0)
                    {
                        sum=num[j].a;
                    }
                    else if(t<=num[j].b-num[j].a)
                    {
                        sum=num[j].a+t;
                    }
                    else
                    {
                        LL s=t/ffabs(num[j].b-num[j].a);
                        LL tp=t%ffabs(num[j].b-num[j].a);
                        if(s%2==0)
                        {
                            sum=num[j].a+tp;
     //                       if(tp==0)sum=num[j].b;
                        }
                        else
                        {
                            sum=num[j].b-tp;
      //                      if(tp==0)sum=num[j].a;
                        }
                    }
                    if(sum>=x&&sum<=y)ca++;
                }
            }
            else
            {
                if(num[j].a<x||num[j].b>y) continue;
                if(num[j].b>=x&&num[j].a<=y)
                {
                    ca++;
                    continue;
                }
                else
                {
                    LL sum=-1;
                    if(t==0)
                    {
                        sum=num[j].a;
                    }
                    else if(t<=ffabs(num[j].a-num[j].b))
                    {
                        sum=num[j].a-t;
                    }
                    else
                    {
                        LL s=t/ffabs(num[j].b-num[j].a);
                        LL tp=t%ffabs(num[j].b-num[j].a);
                        if(s%2==0)
                        {
                            sum=num[j].a-tp;
  //                          if(tp==0)sum=num[j].b;
                        }
                        else
                        {
                            sum=num[j].b+tp;
  //                          if(tp==0)sum=num[j].a;
                        }
                    }
                    if(sum>=x&&sum<=y)ca++;
                }
            }

        }
        printf("%lld\n",ca);
    }
    return 0;
}


 

置换的玩笑

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

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

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

输入

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

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

输出

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

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

如果有多组符合要求的正确解,输出其中任意一组即可。

样例1

输入:

4111109876532

输出:

4 1 11 10 9 8 7 6 5 3 2

 

思路:深搜;技巧根据串的长度先求出最大值,先搜两位数;

转载请注明出处:寻找&星空の孩子

#include<stdio.h>
#include<string.h>
char ch[105];
bool vc[105];
bool vis[105];
int num[105];
int mmax;
int len;
bool flag=false;
int ttt=0;
void dfs(int k,int t)
{

    if(flag) return ;
    num[t]=k;
    int tt=ch[k]-'0';
    if(k+1<len)
    {
        int tp=(ch[k]-'0')*10+ch[k+1]-'0';
        if(tp<=mmax&&!vis[tp]&&!vc[k]&&!vc[k+1])
        {
//           printf("--------------------\n");
            vis[tp]=true;
            vc[k]=true;
            vc[k+1]=true;
            dfs(k+2,t+1);
            vis[tp]=false;
            vc[k]=false;
            vc[k+1]=false;
        }
        if(t==mmax&&k>=len){flag=true; return;}

    }
    if(!vis[tt]&&!vc[k]&&tt<=mmax&&k<len)
    {
        vis[tt]=true;
        vc[k]=true;
        dfs(k+1,t+1);
        vis[tt]=false;
        vc[k]=false;
    }
    if(t==mmax&&k>=len){flag=true; return;}
}
int main()
{
    scanf("%s",ch);
    len=strlen(ch);

    if(len<10) mmax=len;
    else
    {
        mmax=9+(len-9)/2;
    }

    num[0]=1;
    memset(vis,false,sizeof(vis));
    memset(vc,false,sizeof(vc));
    dfs(0,0);
    if(flag)
    {
        for(int i=0,j=1; i<len; i++)
        {
            if(i==num[j])
            {
                printf(" ");
                j++;
            }
            printf("%c",ch[i]);
        }
    }
    return 0;
}
/*
1111085697423
1111085297423
1102345678911
*/


作弊揭发者

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

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

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

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

这么难的项目不得不交给计蒜客实验室了。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<stdio.h>
#include<string.h>
char ans[1005][15];
int main()
{
    char tp[15],num[15];
    int n,ca=0;
    scanf("%s",num);
    scanf("%d",&n);
    while(n--)
    {
        scanf("%s",tp);
        bool bo=true;
        for(int i=0;i<9;i++)
        {
            if(num[i]=='*') continue;
            if(num[i]!=tp[i]){bo=false;break;}
        }
        if(bo){strcpy(ans[ca++],tp);}
    }
    printf("%d\n",ca);
    for(int i=0;i<ca;i++)
    printf("%s\n",ans[i]);
    return 0;
}


 

 

 

 

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值