首页 > 代码库 > 计蒜之道 測试赛

计蒜之道 測试赛

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

绿色能源

蒜头又要改变世界了。

这次他将为一些恶劣地形环境设计太阳能取电方案。

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

这一次,将有 n 座太阳能塔被设置。这些塔已经被提前制作完毕。当中 i 号塔高为 hi,如今project师须要确定将塔安置在哪些位置。以获得最大的总能量。

太阳能塔被安置的地形环境由 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;
}


 

 

 

 

计蒜之道 測试赛