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. [Android] 获取WebView的页面标题(Title)-----WebChromeClient.onReceivedTitle()方法的重写

    应用开发中需要获取WebView当前页面的标题,可能通过对WebChromeClient.onReceivedTitle()方法的重写来实现 效果图如下: 代码如下: public class Mai ...

  2. 二分法-C++

    对于一个非线性方程f(x)=0求改方程的根,我们的思路可以这么想: 1.根的存在性.若该方程没有根,何必徒劳想法设法去求它的解呢?对于一个方程,我们怎么去找他的根,有连续函数零点定理可知:若有f(a) ...

  3. web 安全知识

    目录 背景最简单的 Web 物理架构攻击方式总览Web 软件安全攻击防护浏览器安全攻击Cookie 假冒隐藏变量修改跨站脚本攻击服务器安全攻击缓冲区溢出认证逃避非法输入授权逃避SQL 注入异常敏感信息 ...

  4. 2013集训.DAY21.A

    随便点了一套刷,这套质量挺棒的,学了不少的东西,并且碰到了很久都没有打的题目 T1 card [指针技巧] 题1 集卡片 [问题描述] lzh小时候很喜欢收集卡片,他经常要去商店购买新到的卡片. 商店 ...

  5. 用py2exe打包pyqt4出现的问题(转)

    使用pyqt完成窗体界面很方便,但是打包成exe之后会有问题,在网上找到解决办法如下: Another Solution to the same problem: from distutils.cor ...

  6. VS2012 Unit Test

    VS2012 Unit Test 个人学习汇总(含目录) 首先,给出MSDN相关地址:http://msdn.microsoft.com/en-us/library/Microsoft.VisualS ...

  7. asp.net mvc框架的一些切入点

    IhttpModule+配置文件,对请求进行进一步的整理.过滤与转发: global文件中以Application_xx的保护方法进行切入的方式,此方法等同于IHttpModule方法.IHttpMo ...

  8. java分割excel文件可用jxl

    excel导入是经常使用到的功能,如果文件数据量大的话还是建议分割后导入,java常用的API是poi和jxl,我采用的是jxl,那么让我们来看下怎么用jxl来实现分割. 需要在pom中导入jxl的包 ...

  9. 彩蛋 Python之道

    彩蛋 Python之道 作者:Vamei 出处:http://www.cnblogs.com/vamei 欢迎转载,也请保留这段声明.谢谢! 使用下面的语句可以调出Python中的一个彩蛋, impo ...

  10. GIT 版本控制命令学习

    一   基本命令 1.$ git init 要对现有的某个项目开始用 Git 管理,只需到此项目所在的目录,执行: 2.$ git status 检查当前文件状态 3.git add命令 功能1:可以 ...