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 预处理出每个点八个方向能走的最远距离,然后枚举起点,枚 ...
 
随机推荐
- 6.24 AppCan移动开发者大会:议程重大更新,报名即将关闭
			
大会倒计时2天,议程重大更新,报名通道即将关闭! 创业6年,由AppCan主办的第一届移动开发者大会将在本周五盛大召开.超过100万开发者线上参与.现场1500人规模.50家移动互联企业深度参与.30 ...
 - ASP.NET MVC4 View层_Razor操作Html元素
			
1 常用 Html 标签 1.1 Label Html 语法 :<label for="UserName">用户名</label> Razor语法:@Htm ...
 - APP_Store - 怎样为iOS8应用制作预览视频
			
关于iOS 8应用预览视频的话题,从设计.技术规范,到录屏.编辑工具,介绍的都比较详尽:建议收藏,在接下来用的到的时候作以参考.下面进入译文. 最近一两个月里,苹果的世界里出现了很多新东西,比如屏幕更 ...
 - [转]Ubuntu下配置NFS服务
			
[转]Ubuntu下配置NFS服务 http://blog.163.com/liu8821031%40126/blog/static/111782570200921021253516/ Table ...
 - 关于spring mvc MaxUploadSizeExceededException 死循环解决方案
			
当看到这文章的时候相信你现在应该遇到这样的问题了,我也是自己遇到了后来找到解决方案了记录下来,如果下次遇到就可以直接解决了. 至于为什么会出现这样的情况,可以看这篇文章:https://bz.apac ...
 - 与电子钱包相关的APDU指令
			
CLS:命令报文的类别字节,class byte(类别字节) of command message(命令报文) UranusPay ED/EP: UranusPay是HB公司开发的COS,而ED是电子 ...
 - java静态变量、静态方法和静态代码段
			
先上实例 public class TestStatic { public static String staticString = "this is a static String&quo ...
 - B-tree/B+tree/B*tree [转]
			
(原文出处:http://blog.csdn.net/hbhhww/article/details/8206846) B~树 1.前言: 动态查找树主要有:二叉查找树(Binary Search Tr ...
 - WordPress使用SQLite全新安装
			
首先按照http://blog.csdn.net/guilyn/article/details/13170673的第1.2部操作. 1: 程序下载. NGinX 服务器: http://nginx.o ...
 - 关于Python中的yield
			
关于Python中的yield 在介绍yield前有必要先说明下Python中的迭代器(iterator)和生成器(constructor). 一.迭代器(iterator) 在Python中,f ...