A. 草滩的魔法学校

分析: 高精度乘法 或 JAVA大数类

很明显 10000 的阶乘已经远远超过 64 位数能表示的范围了。所以我们要用一个比较大的数组来存放这个数。那数组要开多少位合适呢?我们不妨计算一下 10000 个 10000 相乘有多少位,是一个 40000 位数。所以 40000 大小的数组肯定够了。接下来就是模拟一下乘法运算。因为数位太大不能直接相乘,所以我们就逐位相乘。相乘得到的数的个位是结果的对应位置的数字,然后除以 10 把进位保留下来,加到下一次乘法中。

在输出的时候注意忽略前导 0.

#include <cstdio>
#include <cstring>
int a[], n, t; void solve( int n ){
int id = , add;
a[] = ;
for( int i = ; i <= n; ++i ){
add = ;
for( int j = ; j <= id; ++j ){
a[j] = a[j] * i + add;
add = a[j] / ;
a[j] = a[j] % ;
}
while( add ){
a[++id] = add % ;
add /= ;
}
}
for( int i = id; i >= ; --i ){
printf( "%d",a[i] );
}
putchar( '\n' );
} int main(){
scanf( "%d", &t );
while( t-- ){
scanf( "%d", &n );
solve(n);
}
return ;
}
import java.math.BigInteger;
import java.util.*;
import java.io.*; public class Main {
public static void main(String args[]) {
Scanner in = new Scanner(System.in);
int test = in.nextInt();
while(test > 0) {
int n;
n = in.nextInt();
BigInteger ans = new BigInteger("1");
for(int i = 2; i <= n; ++i)
ans = ans.multiply(BigInteger.valueOf(i));
System.out.println(ans);
test--;
}
}
}

JAVA代码

B.火影疾风传之旅

分析:简单模拟

题目给了游戏规则,只要你当前分数大于敌人的分数,你就可以获得他的%10 的分数(如果敌人是下忍,则直接把他干掉)。

用一个变量来记录当前分数,然后判断能否打败敌人,能的话继续打下一个,直到被打败或者打败所有敌人。

需要注意的地方是输入的是字母,需要转换成对应的分数,还有字母之间的空格间隔要忽略掉。

#include <cstdio>
int sco, n;
char ch; int check( char ch ){
if( ch == 'X' ) return ;
else if( ch == 'Z' && sco > ) return ;
else if( ch == 'S' && sco > ) return ;
else if( ch == 'H' && sco > ) return ;
else return ;
} int main(){
int cas = ;
while( ~scanf( "%d", &sco ) && sco ){
scanf( "%d", &n );
int flag = ;
while( n-- ){
getchar();
ch = getchar();
if( !flag ) continue;
int add = check( ch );
if( add ){
sco += add;
}else{
flag = ;
}
}
printf( "Case #%d: %d\n", cas++, sco );
}
return ;
}

C.拯救拉面女神

分析: 三维广搜

给出一个三维的迷宫,求从起点到终点的最短路的长度。

用一个结构体来表示点,成员变量有 x、y、z 坐标以及到起点的最短步数 step。在行进的过程中一共有上下左右前后 6 个方向,所以我们从起点开始拓展,如果没有出界或者遇到岩石,则向外走一步,同时步数加 1。把所有拓展出来的点放到一个队列里面。最开始队列里只有起点。从队首取点,如果该点就是终点,答案就是该点对应的 step,否则将所有可拓展的点入队,然后该点出队,直到到达终点或队列为空。

#include<cstdio>
#include<algorithm>
#include<queue>
#include<cstring>
using namespace std;
#define N 52
int g[N][N][N];
int vis[N][N][N];
int dir[][]={,,,-,,,,,,,-,,,,,,,-};
int A,B,C,t;
struct node{
int x,y,z,t;
};
int jud(int x,int y,int z){
if(x>=&&x<A&&y>=&&y<B&&z>=&&z<C&&!g[x][y][z])return ;
else return ;
}
int bfs(node st){
queue<node>q;
q.push(st);
node u,v;
while(!q.empty()){
u=q.front();q.pop();
if(u.x==A-&&u.y==B-&&u.z==C-&&u.t<=t)return u.t;
for(int i=;i<;++i){
v=u;
v.x+=dir[i][];v.y+=dir[i][];v.z+=dir[i][];v.t++;
if(jud(v.x,v.y,v.z)&&!vis[v.x][v.y][v.z]){
q.push(v);vis[v.x][v.y][v.z]=;
}
}
}
return -;
}
int main(){
int K,i,j,k;
scanf("%d",&K);
while(K--){
memset(vis,,sizeof(vis));
scanf("%d%d%d%d",&A,&B,&C,&t);
for(i=;i<A;++i){
for(j=;j<B;++j){
for(k=;k<C;++k)
scanf("%d",&g[i][j][k]);
}
}
node s;
s.x=,s.y=,s.z=,s.t=;
vis[][][]=;
printf("%d\n",bfs(s));
}
return ;
}

D.神奇彩带

分析:next数组性质

给出两个字符串,求最大长度的子串,使得该串是第一个串的前缀同时也是第二串的后缀。

朴素的算法应该是会超时的。这里其实是用到了 KMP 算法中 next 数组的性质,next[i]表示从最长子串,使得该串即是 next[0]到 next[i-1]的前缀也是后缀。所以将两个串并起来中间间隔一个不会出现的字符,比如’#’。所求的 next 最后一个值就是本题的答案。

#include<cstdio>
#include<cstring>
//#include<algorithm>
using namespace std;
#define N 50005
char p[*N],s[N];
int next[*N];
int plen;
void Next(){
next[]=;
plen=strlen(p);
for(int i=,k=;i<plen;++i){
while(k>&&p[k]!=p[i]) k=next[k-];
if(p[k]==p[i]) k++;
next[i]=k;
}
}
int main(){
while(~scanf("%s%s",p,s)){
memset(next,,sizeof(next));
strcat(p,"*");
strcat(p,s);
Next();
printf("%d\n",next[plen-]);
}
return ;
}

E.草滩小王子的相反数

分析:位运算

本题中所谓的“相反数”就是把这个数的二进制左右翻转一下得到的数,注意题目中的输入输出都是十进制数。

最直接的想法就是把这个数转化成二进制,然后翻转数组,最后转化成十进制输出。

然而,最快的办法就是位运算,从最低位取 n 的二进制位,“相反数”则每次左移一位加上所取数字。

#include<cstdio>
int n, sum;
int main(){
while( ~scanf( "%d", &n ) ){
sum = ;
while( n ){
sum <<= ;
sum += n & ;
n >>= ;
}
printf( "%d\n", sum );
}
return ;
}

F.草滩小王子的锻炼

分析:费马小定理+快速幂取模

题目中已经很明确地说了结果会很大很大,一个变量甚至连指数都存不下。高精度也许是可以的,不过这里太麻烦了。因为 49999 是质数,我们用费马小定理来用指数对(49999 - 1)取模,将指数化简为一个很小的数(不过结果依然很大!)。所以在幂运算的过程中每次都要取模。

计算2的幂逐次乘2是很慢的,所以我们每次将2平方会得到 22i

再将指数写成二进制,如果对应位置是 1,就将结果乘上 22i

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int M=;
const int M2=;
char c[];
int pow(int x,int y,int M){
int t=,b=x%M;
while(y){
if(y&)t=(t*b)%M;
b=(b*b)%M;
y>>=;
}
return t;
}
int main(){
int k,i,len;
while(scanf("%s",c)==){
len=strlen(c);
for(k=,i=len-;i>=;i--){
k=(k+(c[i]-'')*pow(,len--i,M2))%M2;
}
printf("%d\n",pow(,k,M));
}
}

G.拉面女神的粉丝

分析:简单数学,质因数分解

#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <cstring>
#include <algorithm>
using namespace std ;
#define LL long long
const int maxn = (<<) ;
LL pr[maxn+] ; void getprime()
{
memset(pr,,sizeof(pr)) ;
for (int i = ; i <= maxn ; ++ i) {
if (!pr[i]) pr[++pr[]] = i ;
for (int j = ; j <= pr[] && i * pr[j] <= maxn ; ++ j) {
pr[i*pr[j]] = ;
if (i%pr[j] == ) break ;
}
}
} LL getans(LL x)
{
if (x == ) return ;
if (x == ) return ;
LL cnt = , ans = ;
for (int i = ; pr[i]*pr[i] <= x ; ++ i) {
if (x%pr[i] == ) {
cnt = ;
while (x%pr[i] == ) {
cnt ++ ;
x /= pr[i] ;
}
ans *= (cnt + ) ;
}
}
if (x > ) ans *= ;
return ans ;
} int main()
{
LL x ;
getprime() ;
while (cin >> x) {
cout << getans(x) << endl ;
}
return ;
}

H.a wise choice!

分析:凸包

//#define LOCAL
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <vector>
using namespace std; struct Point
{
double x, y;
Point(double x=, double y=):x(x), y(y) {}
};
typedef Point Vector;
Point operator + (Point A, Point B)
{
return Point(A.x+B.x, A.y+B.y);
}
Point operator - (Point A, Point B)
{
return Point(A.x-B.x, A.y-B.y);
}
bool operator < (const Point& A, const Point& B)
{
return A.x < B.x || (A.x == B.x && A.y < B.y);
}
bool operator == (const Point& A, const Point& B)
{
return A.x == B.x && A.y == B.y;
}
double Cross(Vector A, Vector B)
{
return A.x*B.y - A.y*B.x;
} vector<Point> ConvexHull(vector<Point> p) {
// 预处理,删除重复点
sort(p.begin(), p.end());
p.erase(unique(p.begin(), p.end()), p.end()); int n = p.size();
int m = ;
vector<Point> ch(n+);
for(int i = ; i < n; i++) {
while(m > && Cross(ch[m-]-ch[m-], p[i]-ch[m-]) <= ) m--;
ch[m++] = p[i];
}
int k = m;
for(int i = n-; i >= ; i--) {
while(m > k && Cross(ch[m-]-ch[m-], p[i]-ch[m-]) <= ) m--;
ch[m++] = p[i];
}
if(n > ) m--;
//for(int i = 0; i < m; ++i) printf("%lf %lf\n", ch[i].x, ch[i].y);
ch.resize(m);
return ch;
} double sumx, sumy; double Dist(Point a, Point b, int m)
{
double A = a.y-b.y, B = b.x-a.x, C = a.x*b.y - b.x*a.y;
//printf("%lf %lf", fabs(A*sumx+B*sumy+C), sqrt(A*A+B*B));
return (fabs(A*sumx+B*sumy+C*m) / sqrt(A*A+B*B));
} int main(void)
{ int T;
scanf("%d", &T);
for(int kase = ; kase <= T; ++kase)
{
int n;
vector<Point> p;
sumx = 0.0, sumy = 0.0;
scanf("%d", &n);
for(int i = ; i < n; ++i)
{
double x, y;
scanf("%lf%lf", &x, &y);
p.push_back(Point(x, y));
sumx += x; sumy += y;
}
vector<Point> ch = ConvexHull(p);
int m = ch.size();
//for(int i = 0; i < m; ++i) printf("%lf %lf\n", ch[i].x, ch[i].y);
if(m <= )
{
printf("Case #%d: 0.000\n", kase);
continue;
} double ans = 1e10;
for(int i = ; i < m; ++i)
ans = min(ans, Dist(ch[i], ch[(i+)%m], n));
printf("Case #%d: %.3lf\n", kase, ans/n);
}
}

J.BirthDay Gift

分析:动态规划

/* ***********************************************
MYID : Chen Fan
LANG : G++
PROG : J_Std
************************************************ */ #include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm> using namespace std; int f[][];
int a[]; int main()
{
// freopen("data.in","r",stdin); int t;
scanf("%d",&t);
for (int tt=;tt<=t;tt++)
{
printf("Case #%d: ",tt); int n,sum=;
scanf("%d",&n); for (int i=;i<=n;i++)
{
scanf("%d",&a[i]);
sum+=a[i];
}
sum/=; for (int i=;i<=n;i++)
for (int j=;j<=;j++) f[i][j]=-; f[][]=;
for (int i=;i<=n;i++)
for (int j=sum;j>=;j--)
if (j>=a[i]) f[i][j]=max(max(f[i-][j],f[i-][j+a[i]]),f[i-][j-a[i]]+a[i]);
else f[i][j]=max(max(f[i-][j],f[i-][j+a[i]]),f[i-][a[i]-j]+j); if (f[n][]==) printf("Unhappy\n");
else printf("Happy %d\n",f[n][]);
} return ;
}

CHD 2014迎新杯比赛题解的更多相关文章

  1. CHD 2015迎新杯题解

    A.预防流感的拉面女神 简析:计算 n 的二进制表示里面 1 的个数 #include <cstdio> #include <cstring> #include <alg ...

  2. 纪中OJ 2019.02.15【NOIP提高组】模拟 B 组 梦回三国 比赛题解(第一个)

    声明 旁边的同学小 H(胡)对我说: “哟,比赛拿了 140,强!要知道,如果哥第三题 AC 了,哥就 230 了,你个废柴!!!(比赛实际分数 130 额呵)” 顿时,千万草泥马从我心中奔腾而过:你 ...

  3. [比赛题解]CWOI2019-1

    [比赛题解]CWOI2019-1 比赛日期:2019.10.12 T1 一道神仙DP题. 我们考虑\(dp[i][j][k]\)表示最后\(i\)位数,\(i-1\)位都是9,最后一位为\(j\),最 ...

  4. 洛谷P2460 [SDOI2007]科比的比赛(题解)(贪心+搜索)

    科比的比赛(题解)(贪心+搜索) 标签:算法--贪心 阅读体验:https://zybuluo.com/Junlier/note/1301158 贪心+搜索 洛谷题目:P2460 [SDOI2007] ...

  5. ZOJ Monthly, June 2014 月赛BCDEFGH题题解

    比赛链接:点击打开链接 上来先搞了f.c,,然后发现状态不正确,一下午都是脑洞大开,, 无脑wa,无脑ce...一样的错犯2次.. 硬着头皮搞了几发,最后20分钟码了一下G,不知道为什么把1直接当成不 ...

  6. 记2014“蓝桥杯全国软件大赛&quot;决赛北京之行

    5月29,30日 最终到了这一天.晚上有数据结构课,10点多的火车,我们就没有去上课,下午在宿舍里收拾东西,晚上8点左右从南校出发,9点半多到达火车站和老师学长学姐们会和. 第一次去北京,第一次买的卧 ...

  7. 【codeforces】【比赛题解】#960 CF Round #474 (Div. 1 + Div. 2, combined)

    终于打了一场CF,不知道为什么我会去打00:05的CF比赛…… 不管怎么样,这次打的很好!拿到了Div. 2选手中的第一名,成功上紫! 以后还要再接再厉! [A]Check the string 题意 ...

  8. 【codeforces】【比赛题解】#950 CF Round #469 (Div. 2)

    剧毒比赛,至少涨了分对吧.: ( [A]Left-handers, Right-handers and Ambidexters 题意: 有\(l\)个右撇子,\(r\)个左撇子,\(a\)个双手都惯用 ...

  9. 【codeforces】【比赛题解】#931 CF Round #468 (Div. 2)

    因为太迟了,所以没去打. 后面打了Virtual Contest,没想到拿了个rank 3,如果E题更快还能再高,也是没什么想法. [A]Friends Meeting 题意: 在数轴上有两个整点\( ...

随机推荐

  1. QTP脚本不能录制怎么办?

    QTP是基于VBS脚本语言的,大部分VBS脚本都能在QTP上运行,只是在一些细节上略有不同,比如说VBS上停止用sleep,QTP上用wait.QTP的强大之处在于对程序窗口的操作,有很多针对窗体的属 ...

  2. NET Framework 4.5新特性 数据库的连接加密保护。

    NET Framework 4.5新特性 (一) 数据库的连接加密保护. NET Framework 4.5 ado.net数据库连接支持使用SecureString内存流方式保密文本.  一旦使用这 ...

  3. VS2013 Update 2正式发布 .NET Framework“云优先、移动优先”

    2013 Update 2正式发布 .NET Framework“云优先.移动优先” 投递人 itwriter 发布于 2014-05-13 12:33 评论(19) 有2155人阅读  原文链接   ...

  4. OSG在WIN与VS中配置与测试

    欢迎访问我的新博客:http://www.milkcu.com/blog/ 原文地址:http://www.milkcu.com/blog/archives/1392531060.html Windo ...

  5. C#有意思的算法题

    年底了,特贡献一些C#有意思的算法题   2013年,即将要过去了.屌丝C#程序员们拿到了年终奖不?是不是又想蠢蠢欲动了?是不是想通过跳槽来为自己实现加薪的梦想?好吧,跳槽之前还是做点准备吧,准备好C ...

  6. c# in deep 之委托

    通俗来讲,委托就是吩咐别人去做某件事,但不知道他具体会怎么做.使用委托必须注意的一个问题是内存泄露问题:假如委托实例本身不能被回收,委托实例会阻止他的目标被作为垃圾回收.尤其是假如某“短命”的对象调用 ...

  7. [转]影响Cache的几个HTTP头信息

    原文地址:http://hi.baidu.com/feilala_fly/item/f79eca08fbf389026c9048a7 Http的Cache机制总共有4个组成部分: Cache-Cont ...

  8. 物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了。

    物理数据模型(PDM)->概念数据模型 (CDM)->面向对象模型 (OOM):适用于已经设计好数据库表结构了.   步骤如下: 一.反向生成物理数据模型PDM 开发环境 PowerDes ...

  9. 最近对Memcache的一些学习

    首先,Memcache是一个高性能的分布式内存对象缓存系统,用于动态Web应用以减轻数据库负载.它通过在内存中缓存数据和对象来减少读取数据库的次数,从而提供动态.数据库驱动网站的速度,再特别强调下:M ...

  10. 工具条OutLookBar

    工具条OutLookBar 灰姑娘本身也有自已的优点,但是却可能因为外貌不讨人喜欢,要变成白雪公主却需要有很多勇气和决心去改变自已: 有一颗善良的心 讨人喜爱的外貌 我这里讲的是一个工具条的蜕变过程, ...