题目链接

A题:(字符串查找,水题)

题意 :输入字符串,如果字符串中包含“ Apple”, “iPhone”, “iPod”, “iPad” 就输出 “MAI MAI MAI!”,如果出现 “Sony” 就输出“SONY DAFA IS GOOD!” ,大小写敏感。

思路 : 字符串查找,水题。

 #include <string.h>
#include <stdio.h>
#include <iostream> using namespace std ; char str[]; int main()
{
int i;
while(gets(str))
{
int len=strlen(str);
for(i=; i<len; i++)
{
if(str[i]=='A' && str[i+]=='p' && str[i+]=='p' && str[i+]=='l' && str[i+]=='e')
printf("MAI MAI MAI!\n");
if(str[i]=='i' && str[i+]=='P' && str[i+]=='h' && str[i+]=='o' && str[i+]=='n'&&str[i+] == 'e')
printf("MAI MAI MAI!\n");
if(str[i]=='i' && str[i+]=='P' && str[i+]=='a' && str[i+]=='d')
printf("MAI MAI MAI!\n");
if(str[i]=='i' && str[i+]=='P' && str[i+]=='o' && str[i+]=='d')
printf("MAI MAI MAI!\n");
if(str[i]=='S' && str[i+]=='o' && str[i+]=='n' && str[i+]=='y')
printf("SONY DAFA IS GOOD!\n");
}
}
return ;
}

E题:(博弈)

题意 : n堆珠子,两个人轮流玩儿,每一次,玩家从某一堆中拿出一些扔掉,至少拿出一个,然后对这堆剩下的,玩家可以不再操作,或者可以将剩下的分为两堆,但是每堆至少一个,然后下一个玩家玩儿,如果哪个玩家玩完一把之后没有珠子了。谁就胜了。

思路 : 类似于Nim游戏,就是多了一个分堆的问题,其实无大碍。。。还是那样分。。。。

#include <stdio.h>
#include <string.h>
#include <iostream> using namespace std ; int main()
{
int n ;
while(scanf("%d",&n)!=EOF)
{
int a,sum = ;
for(int i = ; i < n ;i++)
{
scanf("%d",&a) ;
sum ^= a ;
}
if(sum)puts("Win") ;
else puts("Lose") ;
}
return ;
}

F题:(BFS)

题意 : 告诉你一个骰子上下左右前后上的数字分别是多少,问转最少多少次能够转到另一个骰子的状态,如果不能输出-1,有前转后转左转右转。

思路 : 记录下当前状态在四种转向方式之后变成什么状态,然后加入队列,看能否转到终态。

#include <stdio.h>
#include <string.h>
#include <iostream>
#include <queue> using namespace std ; int mul[] = {,,,,,};
struct node
{
int sta,step ;
friend bool operator < (node a,node b)
{
return a.step > b.step ;
}
} p,temp1,temp2;
int state,a[] ;
bool vis[] ; int BFS()
{
priority_queue<node>Q ;
Q.push(p) ;
vis[p.sta] = true ;
while(!Q.empty())
{
temp1 = Q.top() ;
Q.pop() ;
if(temp1.sta == state) return temp1.step ;
int ss = temp1.sta ;
for(int i = ; i < ; i++)
{
a[i] = ss % ;
ss /= ;
}
//左转
p.sta = ;
p.step = temp1.step + ;
p.sta = *a[]+*a[]+*a[]+*a[]+*a[]+*a[] ;
if(!vis[p.sta])
{
Q.push(p) ;
vis[p.sta] = true ;
}
//右转
p.sta = ;
p.step = temp1.step + ;
p.sta = *a[]+*a[]+*a[]+*a[]+*a[]+*a[] ;
if(!vis[p.sta])
{
Q.push(p) ;
vis[p.sta] = true ;
}
//后转
p.sta = ;
p.step = temp1.step + ;
p.sta = *a[]+*a[]+*a[]+*a[]+*a[]+*a[] ;
if(!vis[p.sta])
{
Q.push(p) ;
vis[p.sta] = true ;
}
//前转
p.sta = ;
p.step = temp1.step + ;
p.sta = *a[]+*a[]+*a[]+*a[]+*a[]+*a[] ;
if(!vis[p.sta])
{
Q.push(p) ;
vis[p.sta] = true ;
}
}
return - ;
}
int main()
{
int a;
while(scanf("%d",&a)!=EOF)
{
p.sta = a ;
for(int i = ; i < ; i++)
{
scanf("%d",&a) ;
p.sta += a*mul[i] ;
}
p.step = ;
state = ;
for(int i = ; i < ; i++)
{
scanf("%d",&a) ;
state += a*mul[i] ;
}
//printf("%d %d\n",p.sta,state) ;
memset(vis,false,sizeof(vis)) ;
if(p.sta == state)
{
puts("") ;
continue ;
}
int t = BFS() ;
printf("%d\n",t) ;
}
return ;
}

H题 : (位运算)

题意 : 有n+1个数,数组a满足两个条件,是数组里的所有数大小都在[0,n]之间,而且两两不相等,b数组也满足这个条件,然后让你求t = (a0 ⊕ b0) + (a1 ⊕ b1) +···+ (an ⊕ bn)这个t的最大值,然后输出当t最大的时候b数组的数分别是什么。

思路 : 给你一个数,你所能异或到的最大数就是全都是1,例如5(101)能够异或到的最大数就是111,是跟010异或之后,for循环倒着找每个数跟全都是1的情况下得到的数是多少即可。a^b=c,则a^c=b,b^c=a。。。。。。

 #include <stdio.h>
#include <string.h>
#include <iostream> using namespace std; int a[],b[],vis[]; int sum(int x)//求这个数有多少位
{
int cnt = ;
while(x)
{
x >>= ;
cnt ++ ;
}
return cnt ;
}
int main()
{
int n ;
while(scanf("%d",&n)!= EOF)
{
memset(vis,,sizeof(vis)) ;
for(int i = ; i <= n ; i++)
{
scanf("%d",&a[i]) ;
}
for(int i = n ; i >= ; i--)
{
if(vis[i]) continue ;
int ss = ( << sum(i)) - ;//求出这个数全是1
int temp = ss ^ i ;
b[temp] = i ;
b[i] = temp ;
vis[temp] = vis[i] = ;
}
long long s = ;
for(int i = ; i <= n ; i++)
s += (long long)(b[i] ^ i) ;
printf("%I64d\n",s) ;
for(int i = ; i <= n ; i++)
printf(i == n ? "%d\n":"%d ",b[a[i]]) ;
}
return ;
}

I题:(矩阵快速幂)

题意 : 一个矩阵,告诉你第0行是233 2333 23333 233333……然后给出第0列,让你自己构造矩阵,a[i][j]=a[i-1][j]+a[i][j-1],然后问你a[n][m]等于多少。

思路 : 首先构造矩阵,本题中列号与行号都是从1开始。把0所在的位置换成23,假定给定的样例是:3   7   24   47   16 ,现在的第一列就应该是23 24 47 16。由此,第二列第个数233就是由10个23加1个3组成的,再根据a[i][j]=a[i-1][j]+a[i][j-1],就可以通过前一列来推出后一列了。将3作为最后一个数。

23      233

24    233+24

47    233+24 +47

16    233+24 +47+16

3         3

由以上可知,将第一列横置得,23  24  47  16  3,接下来可以递推下一列了

233  =   10*23+0*24+0*47+0*16+1*3

233+24  =   10*23+1*24+0*47+0*16+1*3

233+24 +47 =   10*23+1*24+1*47+0*16+1*3

233+24 +47+16 =   10*23+1*24+1*47+1*16+1*3

3 =     0*23+0*24+0*47+0*16+1*3

将系数画成一个矩阵  10 0 0 0 1

10 1 0 0 1

10 1 1 0 1

10 1 1 1 1

0 0 0 0 1

所以,可以得出规律

a[0][m]  | 10 0 0 0 1|    | a[0][m-1] |
a[1][m]  | 10 1 0 0 1|    | a[1][m-1] |
a[2][m] =  | 10 1 1 0 1| *   | a[2][m-1] |
a[3][m]  | 10 1 1 1 1|    | a[3][m-1] |
3           | 0   0 0 0 1|     | 3              |

所以a[n][m]就等于中间那个矩阵的m-1次方乘上第一列。。。。。。

其他题解

 #include <stdio.h>
#include <string.h>
#include <math.h>
#include <iostream>
#define LL __int64
#define mod 10000007
using namespace std ;
int n,m ;
struct mat
{
LL v[][] ;
mat()
{
memset(v,,sizeof(v)) ;
for(int i = ; i <= n+ ; i++)
v[i][i] = ;
}
};
mat e ; mat matrix_mul(mat p1,mat p2)
{
mat t ;
for(int i = ; i <= n+ ; i++)
{
for(int j = ; j <= n+ ; j++)
{
t.v[i][j] = ;
for(int k = ; k <= n+ ; k++)
{
t.v[i][j] = (t.v[i][j] + (p1.v[i][k]*p2.v[k][j])%mod)%mod ;
}
}
}
return t ;
}
mat matrix_mi(mat p,int k)
{
mat t ;
// for(int i = 1 ; i <= n+2 ; i ++)
// t.v[i][i] = 1 ;
while(k)
{
if(k&)
{
t = matrix_mul(t,p) ;
}
k >>= ;
p = matrix_mul(p,p) ;
}
return t ;
}
void Init()
{
memset(e.v,,sizeof(e.v)) ;
for(int i = ; i <= n+ ; i++)
e.v[i][] = ;
for(int i = ; i <= n+ ; i++)
{
for(int j = ; j <= n+ ; j++)
{
if(i >= j)
e.v[i][j] = ;
}
}
for(int i = ; i <= n+ ; i++)
e.v[i][n+] = ;
}
int main()
{
LL a[],sum[] ;
while(~scanf("%d %d",&n,&m))
{
sum[] = ;
for(int i = ; i <= n ; i++)
{
scanf("%I64d",&a[i]) ;
sum[i] = sum[i-]+a[i] ;
}
Init() ;
mat ans = matrix_mi(e,m-) ;
mat cnt ;
cnt.v[][] = ;
for(int i = ; i <= n+ ; i++)
cnt.v[i][] = ( + sum[i-])%mod ;
cnt.v[n+][] = ;
ans = matrix_mul(ans,cnt) ;
printf("%I64d\n",ans.v[n+][]%mod) ;
}
return ;
}

2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)的更多相关文章

  1. hdu 5016 点分治(2014 ACM/ICPC Asia Regional Xi'an Online)

    Mart Master II Time Limit: 12000/6000 MS (Java/Others)    Memory Limit: 65536/65536 K (Java/Others)T ...

  2. 2014 ACM/ICPC Asia Regional Xi'an Online

    03 hdu5009 状态转移方程很好想,dp[i] = min(dp[j]+o[j~i]^2,dp[i]) ,o[j~i]表示从j到i颜色的种数. 普通的O(n*n)是会超时的,可以想到o[]最大为 ...

  3. HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)

    思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’   'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...

  4. 2014 ACM/ICPC Asia Regional Xi'an Online Paint Pearls

    传说的SB DP: 题目 Problem Description Lee has a string of n pearls. In the beginning, all the pearls have ...

  5. HDU 5000 2014 ACM/ICPC Asia Regional Anshan Online DP

    Clone Time Limit : 2000/1000ms (Java/Other)   Memory Limit : 65536/65536K (Java/Other) Total Submiss ...

  6. HDU 5029 Relief grain(离线+线段树+启发式合并)(2014 ACM/ICPC Asia Regional Guangzhou Online)

    题目链接:http://acm.hdu.edu.cn/showproblem.php?pid=5029 Problem Description The soil is cracking up beca ...

  7. HDU 5000 Clone(离散数学+DP)(2014 ACM/ICPC Asia Regional Anshan Online)

    Problem Description After eating food from Chernobyl, DRD got a super power: he could clone himself ...

  8. 2014 ACM/ICPC Asia Regional Shanghai Online

    Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...

  9. 2014 ACM/ICPC Asia Regional Guangzhou Online

    Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...

随机推荐

  1. C++ 的全局构造与析构函数

    我们知道一般的C/C++ 的程序是从main函数开始的,然后在main函数结束后程序结束.但是不然,在main函数开始执行前,已经有其他的指令被执行了. 为了程序的顺利执行,首先要初始化执行环境,比如 ...

  2. nodejs for centos配置

    mongodb http://www.cnblogs.com/zhoulf/archive/2013/01/31/2887439.html nodejs http://zhaohe162.blog.1 ...

  3. iOS 进阶 第十九天(0423)

    0427 深复制/浅复制 浅复制:是址引用 深复制:是值拷贝 下面是解释,如下图: 运行时机制runtime 1.表象的就是MPMoviePlayer 2.深层的是 clang -rewrite-ob ...

  4. iOS9新系统下APP Store 应用上传新指南

    一 iTunes Connect介绍 iTunes Connect是面向iOS应用开发人员的苹果门户网站,供开发人员管理其应用,跟踪下载情况.今年1月份闹得沸沸扬扬的iTunes Connect BU ...

  5. 替换APK中的jar包文件

    [Qboy] 2014年12月21日 这几天,我第一次做的android游戏(WE!青春纪)马上就要上线.上线之前需要把各个渠道的SDK加入到我们游戏中,与渠道进行联运.但是商务很给力,一下子联系了1 ...

  6. PHP错误The server encountered an internal error or misconfiguration and was unable to complete your re

    我的笔记本电脑上的环境安装了很多次,但是运行项目时总是会报The server encountered an internal error or misconfiguration and was un ...

  7. 创建ubuntu软件源

    缘起:虚拟机需要安装一些文件,但是直接从外网下载比较慢,而且安装iso包中是有这些软件的,所以创建一个ubuntu  apt server ubuntu 12.04, 本机192.168.0.124, ...

  8. Bootstrap入门二:响应式页面布局

    Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mixin 用于生成更具 ...

  9. java 多个设备,锁定先后顺序

    场景图: 4台android设备需要被锁定顺序,下次的时候按顺序socket推送数据到这4台不同的内容.当有新的一台机器加入时,如上图的E,则插入到原位置为C的地方.具体代码如下: public st ...

  10. IOS常用加密GTMBase64

    GTMDefines.h // // GTMDefines.h // // Copyright 2008 Google Inc. // // Licensed under the Apache Lic ...