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 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...
随机推荐
- js的reduce方法,改变头等函数
头等函数:把编程变成了类似搭积木的方式编码,可以使用很少的代码,实现强大的功能函数. eg: getTotal:数组的求和运算. var myArray = [1,2,3,4]; var add = ...
- hdu 5166 Missing number
题目连接 http://acm.hdu.edu.cn/showproblem.php?pid=5166 Missing number Description There is a permutatio ...
- bzoj 3196/tyvj p1730 二逼平衡树
原题链接:http://www.tyvj.cn/p/1730 树套树... 如下: #include<cstdio> #include<cstdlib> #include< ...
- jquery介绍
1.jQuery (1)jQuery简介 是一个js框架(.js文件),它的最大特点是,使用选择器( 借鉴了css选择器的语法)查找要操作的节点,并且将这些 节点封装成一个jQuery对象,通过调用j ...
- activemq整合spring
- mysql安装/启动报错汇总
2016/9/6补充 初始化报错: # /usr/local/mysql/scripts/mysql_install_db --user=mysql --basedir=/usr/local/mysq ...
- ORA-12154:TNS:无法解析指定的连接标识符
ORA-12154:TNS:无法解析指定的连接标识符 1问题的描述 Oracle11g server 64bit服务器端安装在Windows Server2008 Enterprise上,安装Orac ...
- c++中的virtual函数,即虚函数
c++中的虚函数主要是用来实现多态的,虽然都同时指向父类的实例.但调用的确实子类的函数,这个有点像java的接口和实现的关系了.一个接口有多种实现,一个接口对象调用的是哪个实现的方法,这个就是多态了 ...
- xml之基础了解
1.简介 1>什么XML语言(eXtensible Markup Language) 可扩展标记语言XML是SGML的子集,其目标是允许普通的SGML在Web上以目前HTML的方式被服务.接受和 ...
- MyEclipse运行很慢的原因
myEclipse以其丰富的功能博得程序员的热爱,但是其速度确实有问题,jsp文 件打开会不停的校验,甚至出现卡死,分析原因,原来是 validation在做怪. 好,既然找到了原因,那就把问题解决, ...