2014 ACM/ICPC Asia Regional Xi'an Online(HDU 5007 ~ HDU 5017)
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)的更多相关文章
- 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 ...
- 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[]最大为 ...
- HDU 5010 Get the Nut(2014 ACM/ICPC Asia Regional Xi'an Online)
思路:广搜, 因为空格加上动物最多只有32个那么对这32个进行编号,就能可以用一个数字来表示状态了,因为只有 ‘P’ 'S' 'M' '.' 那么就可以用4进制刚好可以用64位表示. 接下去每次就 ...
- 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 ...
- 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 ...
- 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 ...
- 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 ...
- 2014 ACM/ICPC Asia Regional Shanghai Online
Tree http://acm.hdu.edu.cn/showproblem.php?pid=5044 树链剖分,区间更新的时候要用on的左++右--的标记方法,要手动扩栈,用c++交,综合以上的条件 ...
- 2014 ACM/ICPC Asia Regional Guangzhou Online
Wang Xifeng's Little Plot http://acm.hdu.edu.cn/showproblem.php?pid=5024 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...
随机推荐
- C++ 的全局构造与析构函数
我们知道一般的C/C++ 的程序是从main函数开始的,然后在main函数结束后程序结束.但是不然,在main函数开始执行前,已经有其他的指令被执行了. 为了程序的顺利执行,首先要初始化执行环境,比如 ...
- nodejs for centos配置
mongodb http://www.cnblogs.com/zhoulf/archive/2013/01/31/2887439.html nodejs http://zhaohe162.blog.1 ...
- iOS 进阶 第十九天(0423)
0427 深复制/浅复制 浅复制:是址引用 深复制:是值拷贝 下面是解释,如下图: 运行时机制runtime 1.表象的就是MPMoviePlayer 2.深层的是 clang -rewrite-ob ...
- iOS9新系统下APP Store 应用上传新指南
一 iTunes Connect介绍 iTunes Connect是面向iOS应用开发人员的苹果门户网站,供开发人员管理其应用,跟踪下载情况.今年1月份闹得沸沸扬扬的iTunes Connect BU ...
- 替换APK中的jar包文件
[Qboy] 2014年12月21日 这几天,我第一次做的android游戏(WE!青春纪)马上就要上线.上线之前需要把各个渠道的SDK加入到我们游戏中,与渠道进行联运.但是商务很给力,一下子联系了1 ...
- 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 ...
- 创建ubuntu软件源
缘起:虚拟机需要安装一些文件,但是直接从外网下载比较慢,而且安装iso包中是有这些软件的,所以创建一个ubuntu apt server ubuntu 12.04, 本机192.168.0.124, ...
- Bootstrap入门二:响应式页面布局
Bootstrap 提供了一套响应式.移动设备优先的流式栅格系统,随着屏幕或视口(viewport)尺寸的增加,系统会自动分为最多12列.它包含了易于使用的预定义类,还有强大的mixin 用于生成更具 ...
- java 多个设备,锁定先后顺序
场景图: 4台android设备需要被锁定顺序,下次的时候按顺序socket推送数据到这4台不同的内容.当有新的一台机器加入时,如上图的E,则插入到原位置为C的地方.具体代码如下: public st ...
- IOS常用加密GTMBase64
GTMDefines.h // // GTMDefines.h // // Copyright 2008 Google Inc. // // Licensed under the Apache Lic ...