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); }}
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 【2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛
- 2017"百度之星"程序设计大赛-资格赛
- Python 信用卡评分模型 自动分箱&逻辑回归&制作评分卡
- splay普通平衡树coedvs4543
- Ubuntu下FFmpeg编译
- 读书笔记(一) OCR字符识别-----Halcon机器视觉 应用手册
- Flask-Migrate实现数据库迁移
- 2017"百度之星"程序设计大赛
- Python *args, **kwargs 的用法和用处
- 解决CardView无点击效果,实现水波纹效果
- 动态规划(1) 最长递增子序列 leetcode 300系列
- hdu6133
- Git 入门篇
- OGNL表达式struts2标签“%,#,$”
- 共享受限资源
- 图片选取器