2017"百度之星"程序设计大赛

来源:互联网 发布:java界面布局类型 编辑:程序博客网 时间:2024/06/11 11:41

Arithmetic of Bomb Accepts: 1050 Submissions: 1762
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
众所周知,度度熊非常喜欢数字。
它最近在学习小学算术,第一次发现这个世界上居然存在两位数,三位数……甚至N位数!
但是这回的算术题可并不简单,由于含有表示bomb的#号,度度熊称之为 Arithmetic of Bomb。
Bomb Number中的bomb,也就是#号,会展开一些数字,这会导致最终展开的数字超出了度度熊所能理解的范畴。比如”(1)#(3)”表示”1”出现了3次,将会被展开为”111”,
同理,”(12)#(2)4(2)#(3)”将会被展开为”12124222”。
为了方便理解,下面给出了Bomb Number的BNF表示。
请将Bomb Number中所有的#号展开,由于数字可能很长,结果对 1 000 000 007 取模。
Input
第一行为T,表示输入数据组数。
每组数据包含一个Bomb Expression。
1≤T≤100
1≤length(Bomb Number)≤1000
Output
对每组数据输出表达式的结果,结果对 1 000 000 007 取模。
Sample Input
4
1
(1)#(3)
(12)#(2)4(2)#(3)
(12)#(5)
Sample Output
1
111
12124222
212121205
题解:模拟就行了。。。
代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<set>#include<algorithm>#include<map>#include<math.h>using namespace std;typedef long long int ll;typedef pair<int,int>pa;const int N=1e5+100;const int mod=1e9+7;const ll INF=1e18;int read(){    int x=0;    char ch = getchar();    while('0'>ch||ch>'9')ch=getchar();    while('0'<=ch&&ch<='9')    {        x=(x<<3)+(x<<1)+ch-'0';        ch=getchar();    }    return x;}/***********************************************************/int t;char str[10000];string ans,zhi;int main(){    scanf("%d",&t);    while(t--)    {        int cnt=0;        scanf("%s",str);        int sz=strlen(str);        ll c=0;        bool flag=false;        ans.clear();        for(int i=0; i<sz; i++)        {            if(str[i]=='(')            {                if(flag)                {                    int j=i;                    while(str[++j]!=')')                    {                        c=c*10+str[j]-'0';                    }                    i=j;                    for(ll k=1;k<=c;k++)                    {                        ans+=zhi;                    }                    zhi.clear();                    c=0;                    flag=false;                }                else                {                    int j=i;                    while(str[++j]!=')')                    {                       zhi+=str[j];                    }                    i=j;                }            }            else if(str[i]=='#')            {                flag=true;            }            else            {                ans+=str[i];            }        }        int l=ans.length();        ll ok=0;        for(int i=0;i<l;i++)        {            ok=(ok*10+ans[i]-'0')%mod;        }        printf("%I64d\n",ok);    }}

Pokémon GO Accepts: 738 Submissions: 1725
Time Limit: 3000/1500 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
众所周知,度度熊最近沉迷于 Pokémon GO。

今天它决定要抓住所有的精灵球!

为了不让度度熊失望,精灵球已经被事先放置在一个2*N的格子上,每一个格子上都有一个精灵球。度度熊可以选择任意一个格子开始游戏,抓捕格子上的精灵球,然后移动到一个相邻的至少有一个公共点的格子上继续抓捕。例如,(2, 2) 的相邻格子有(1, 1), (2, 1) 和 (1, 2) 等等。

现在度度熊希望知道将所有精灵球都抓到并且步数最少的方案数目。两个方案被认为是不同,当且仅当两个方案至少有一步所在的格子是不同的。

Input
第一行为T,表示输入数据组数。

每组数据包含一个数N。

●1≤T≤100

●1≤N≤10000

Output
对每组数据输出方案数目,结果对 1 000 000 007 取模。

Sample Input
3
1
2
3
Sample Output
Copy
2
24
96
题解:原题。
代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<set>#include<algorithm>#include<map>#include<math.h>using namespace std;typedef long long int ll;typedef pair<int,int>pa;const int N=1e5+100;const int mod=1e9+7;const ll INF=1e18;int read(){    int x=0;    char ch = getchar();    while('0'>ch||ch>'9')ch=getchar();    while('0'<=ch&&ch<='9')    {        x=(x<<3)+(x<<1)+ch-'0';        ch=getchar();    }    return x;}/***********************************************************/ll a[N];ll b[N];ll c;int n,t;void init(){    b[1]=1;    for (int i=2; i<=10000; i++)    {        b[i]=(b[i-1]*2%mod);        b[i]%=mod;    }    a[1]=1;    a[2]=6;    for (int i=3; i<=10000; i++)    {        a[i]=(2*a[i-1]+b[i]+4*a[i-2])%mod;    }}void slove(){    c=4*a[n];    for (int i=2; i<n; i++)    {        c=(c+(8*b[n-i]*a[i-1]%mod)%mod+(8*a[n-i]*b[i-1])%mod)%mod;    }    printf("%I64d\n",c);}int main(){    init();    scanf("%d",&t);    while(t--)    {        scanf("%d",&n);        if(n==1) puts("2");        else slove();    }    return 0;}

Valley Numer Accepts: 548 Submissions: 1125
Time Limit: 2000/1000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)
Problem Description
众所周知,度度熊非常喜欢数字。

它最近发明了一种新的数字:Valley Number,像山谷一样的数字。

当一个数字,从左到右依次看过去数字没有出现先递增接着递减的“山峰”现象,就被称作 Valley Number。它可以递增,也可以递减,还可以先递减再递增。在递增或递减的过程中可以出现相等的情况。

比如,1,10,12,212,32122都是 Valley Number。

121,12331,21212则不是。

度度熊想知道不大于N的Valley Number数有多少。

注意,前导0是不合法的。

Input
第一行为T,表示输入数据组数。

每组数据包含一个数N。

● 1≤T≤200

● 1≤length(N)≤100

Output
对每组数据输出不大于N的Valley Number个数,结果对 1 000 000 007 取模。

Sample Input
3
3
14
120
Sample Output
Copy
3
14
119
题解:数位dp,设dp[i][j][k]表示当前位,前一位为j,前面是否为递增。
然后转移一下就行。
代码:

#include<iostream>#include<stdio.h>#include<stdlib.h>#include<string.h>#include<vector>#include<queue>#include<set>#include<algorithm>#include<map>#include<math.h>using namespace std;typedef long long int ll;typedef pair<int,int>pa;const int N=1e5+100;const int mod=1e9+7;const ll INF=1e18;int read(){    int x=0;    char ch = getchar();    while('0'>ch||ch>'9')ch=getchar();    while('0'<=ch&&ch<='9')    {        x=(x<<3)+(x<<1)+ch-'0';        ch=getchar();    }    return x;}/***********************************************************/int t;char str[110];int a[110];ll dp[110][11][2];ll dfs(int pos,int zhi,int sta ,bool limit,bool lead){    if(pos==-1) return 1;    if(!limit&&dp[pos][zhi][sta]!=-1&&!lead)    return dp[pos][zhi][sta];    ll ans=0;    int up=limit?a[pos]:9;    for(int i=0;i<=up;i++)    {        if(lead)        {            if(i==0)                ans+=dfs(pos-1,0,0,limit&&i==a[pos],true);            else                ans+=dfs(pos-1,i,0,limit&&i==a[pos],false);        }        else        {            if(sta==1)            {                if(i>=zhi)                    ans+=dfs(pos-1,i,1,limit&&i==a[pos],false);            }            else            {                ans+=dfs(pos-1,i,i>zhi,limit&&i==a[pos],false);            }        }    }    ans=ans%mod;    if(!limit&&!lead)    dp[pos][zhi][sta]=ans;        return ans;}ll solve(){    int pos=0;    int sz=strlen(str);    for(int i=sz-1;i>=0;i--)    {        a[pos++]=str[i]-'0';    }    return dfs(pos-1,0,0,true,true)%mod;}int main(){    scanf("%d",&t);    memset(dp,-1,sizeof(dp));    while(t--)    {        scanf("%s",str);        printf("%I64d\n",(solve()-1+mod)%mod);    }}
原创粉丝点击