2014 BUPT 新生排位赛11
来源:互联网 发布:孙燕姿的遇见知乎 编辑:程序博客网 时间:2024/05/12 17:30
A 小妹妹的个数
链接:http://code.bupt.edu.cn/problem/p/488/
思路:乱搞法,平方分割加打表,还没有写出来。
B 田田背课文
链接:http://code.bupt.edu.cn/problem/p/480/
大致题意:求一个字符串的最短不重复子串。
思路:其实就是上次的最长重叠子串+1,姿势有很多种,直接暴力,hash+vector,后缀数组等等~
code:
#include <iostream>#include <cstring>#include <cstdlib>#include<cstdio>#include <algorithm>#include <vector>#include <set>#define INF 1000000000#define eps 1e-9using namespace std;const int MAX_E=1;const int MAX_N=1000005;const int MAX_M=10007;typedef unsigned long long ull;const ull B=9937;char st[MAX_N];vector<ull>vv[MAX_M];void solve(){ for(int i=0;i<MAX_M;i++) vv[i].clear(); int l=strlen(st); ull kk; ull tt; int dd; bool flag; for(int i=1;i<=l;i++){ kk=0; tt=1; flag=1; for(int j=0;j<i;j++){ kk=kk*B+st[j]; tt*=B; } dd=kk%MAX_M; vv[dd].push_back(kk); for(int j=1;j+i-1<l;j++){ kk=kk*B+st[j+i-1]-st[j-1]*tt; dd=kk%MAX_M; for(int i=0;i<vv[dd].size();i++){ if(vv[dd][i]==kk){ flag=0; break; } } if(flag==0) break; vv[dd].push_back(kk); } if(flag==1){ printf("%d\n",i); return ; } }} int main(){ while(scanf("%s",st)!=EOF){ solve(); }}
C 小妹妹采蘑菇
链接:http://code.bupt.edu.cn/problem/p/478/
思路:其实我一开始想的是dp的方法,后来zy给我说是找规律,我就一直开始找规律,最后就是一个几何概型(其实感觉直接想就可以)。对于采n种不同的蘑菇,我们可以这样想,一开始取任意一种不重复的蘑菇的概率是1,第二次取一种不跟刚才情况重复的蘑菇的概率是(n-1)/n,第三次的概率是(n-2)/n........... 所以我们就能得到每一步的最小步数的期望就是概率的倒数,第一次是1,第二次是(n-1)/(n),第三次是(n-2)/n..........这样将每一种情况加起来就能得到总的最小步数期望。
code:
#include <iostream>#include <cstring>#include <cstdlib>#include<cstdio>#include <algorithm>#include <vector>#include <set>#define INF 1000000000#define eps 1e-9using namespace std;const int MAX_E=1;const int MAX_N=1000005;const int MAX_M=10007;int main(){ double a[110]; a[1]=1; for(int i=2;i<=100;i++){ double mid=1; for(int j=i-1;j>=1;j--) mid+=(double)i/j; a[i]=mid; } int n; while(scanf("%d",&n)!=EOF){ printf("%.6f\n",a[n]); }}
我感觉很有必要用概率dp的方法再写一次,待更新~~~~
~动态规划的方法~::dp[i][j]表示用j步取i个不同的蘑菇的概率,n表示蘑菇的种树,
状态转移方程是 dp[i][j]=dp[i-1][j-1]*(n-i+1)/n+dp[i][j-1]*(i)/n; (i<n)
dp[i][j]=dp[i-1][j-1]*(n-i+1)/n;(i==n) 因为取到n个的时候就结束了,所以不可能由第二种方案再转移过来
dp的边界条件 (1)dp[1][1]=1 (2) for(int i=2;i<=MAX_N;i++) dp[1][i]=dp[1][i-1]*(1/n); 其中MAX_N是我设定的最大步数,此题我设定了3000就可以过了
code:
#include <iostream>#include <cstring>#include <cstdlib>#include<cstdio>#include <algorithm>#include <vector>#include <set>#define INF 1000000000#define eps 1e-9using namespace std;const int MAX_E=1;const int MAX_N=3005;const int MAX_M=110;double dp[MAX_M][MAX_N];double ans[MAX_M];void Dp(){ memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); for(int n=1;n<=100;n++){ dp[1][1]=1.00; for(int i=2;i<=MAX_N;i++) dp[1][i]=dp[1][i-1]*((double)1/n); for(int i=2;i<=n;i++){ for(int j=i;j<=MAX_N;j++){ if(i==n) dp[i][j]=dp[i-1][j-1]*((double)(n-i+1)/n); else dp[i][j]=dp[i-1][j-1]*((double)(n-i+1)/n)+dp[i][j-1]*((double)i/n); } } for(int k=n;k<=MAX_N;k++) ans[n]+=(double)k*dp[n][k]; } ans[1]=1.00;}int main(){ int n; Dp(); while(scanf("%d",&n)!=EOF){ printf("%.6f\n",ans[n]); } return 0;}
还有一个乱搞版的,当时什么思考的都不清晰,就写了一个版本还过了,写题解的时候才发现有这么多的问题,求指点为什么能过。。
code:
#include <iostream>#include <cstring>#include <cstdlib>#include<cstdio>#include <algorithm>#include <vector>#include <set>#define INF 1000000000#define eps 1e-9using namespace std;const int MAX_E=1;const int MAX_N=3005;const int MAX_M=110; double dp[MAX_M][MAX_N];double ans[MAX_M];void Dp(){ memset(dp,0,sizeof(dp)); memset(ans,0,sizeof(ans)); for(int i=1;i<=100;i++){ dp[1][1]=1.00; for(int j=2;j<=i;j++){ for(int k=j;k<=MAX_N;k++){ dp[j][k]=dp[j-1][k-1]*((double)(i-j+1)/i)+dp[j][k-1]*((double)(j-1)/i); } } for(int k=i;k<=MAX_N;k++) ans[i]+=(double)k*dp[i][k]; }}int main(){ int n; Dp(); while(scanf("%d",&n)!=EOF){ printf("%.6f\n",ans[n]); } return 0;}
D 焦级长的激光炮
链接:http://code.bupt.edu.cn/problem/p/482/
大致题意:
思路:
code:
E 小妹妹去划船
链接:http://code.bupt.edu.cn/problem/p/489/
思路:纯模拟,因为可以放锚所以一定不会向偏离目的地的方向前进的,所以就计算出来两点之间的坐标差,分成四个方向,扫一遍字符串就行了,要注意区间的开闭以及一些特殊的情况。
code:
#include <iostream>#include <cstring>#include <cstdlib>#include<cstdio>#include <algorithm>#include <vector>#include <set>#define INF 1000000000#define eps 1e-9using namespace std;const int MAX_E=1;const int MAX_N=100010;const int MAX_M=10007; int main(){ int sx,sy,ex,ey,t; char st[MAX_N]; int mx,my,l; bool flag; while(scanf("%d%d%d%d%d",&t,&sx,&sy,&ex,&ey)!=EOF){ scanf("%s",st); mx=ex-sx; my=ey-sy; l=strlen(st); flag=1; if(mx>0&&my>=0){ for(int i=0;i<l;i++){ if(st[i]=='N'&&my>0) my--; if(st[i]=='E'&&mx>0) mx--; if(my==0&&mx==0){ flag=0; printf("%d\n",i+1);break; } } } else if(mx<=0&&my>0){ mx=-mx; for(int i=0;i<l;i++){ if(st[i]=='N'&&my>0) my--; if(st[i]=='W'&&mx>0) mx--; if(my==0&&mx==0){ flag=0; printf("%d\n",i+1);break; } } } else if(mx<0&&my<=0){ mx=-mx; my=-my; for(int i=0;i<l;i++){ if(st[i]=='S'&&my>0) my--; if(st[i]=='W'&&mx>0) mx--; if(my==0&&mx==0){ flag=0; printf("%d\n",i+1);break; } } } else if(mx>=0&&my<0){ my=-my; for(int i=0;i<l;i++){ if(st[i]=='S'&&my>0) my--; if(st[i]=='W'&&mx>0) mx--; if(my==0&&mx==0){ flag=0; printf("%d\n",i+1);break; } } } else if(mx==0&&my==0){ flag=0; printf("0\n"); } if(flag) printf("-1\n"); }}
- 2014 BUPT 新生排位赛11
- BUPT 2014新生暑假个人排位赛11
- 2014 BUPT 新生排位赛01
- 2014 BUPT 新生排位赛02
- 2014 BUPT 新生排位赛03
- 2014 BUPT 新生排位赛05
- 2014 BUPT 新生排位赛06
- 2014 BUPT 新生排位赛04
- 2014 BUPT 新生排位赛08
- 2014 BUPT 新生排位赛07
- 2014 BUPT 新生排位赛09
- BUPT 2014新生暑假个人排位赛01
- BUPT 2014新生暑假个人排位赛02
- BUPT 2014新生暑假个人排位赛03
- BUPT 2014新生暑假个人排位赛04
- BUPT 2014新生暑假个人排位赛05
- 8.6-2014新生暑假个人排位赛11
- 2014新生暑假个人排位赛11
- GNU Emacs下设置Java编程环境(JDEE)
- poj1556(建图,最短路)
- java,用post方法提交数据,并且从服务器返回结果。
- 矩阵十题【二】 poj 1575 Tr A poj 3233 Matrix Power Series
- postgreSql的字符串操作函数
- 2014 BUPT 新生排位赛11
- 报错:Unexpected Exception caught setting 'undefined'
- Ping使用方法大全
- Linux下设置环境变量
- Cocos2d-x 手游聊天系统Demo实现(Lua实现)
- (上)--螺旋矩阵的打印---由内向外旋转的八种情况
- tomcat执行shutdown之后tomcat进程任然存在
- linux下shell脚本学习
- 租房类APP--资产管理人员(在中国代为大少-驱逐租户-维修保护-中介)-房东-租户