阿里九游开放平台近日上架了一款新的益智类游戏——成三棋。成三棋是我国非常古老的一个双人棋类游戏,其棋盘如下图所示:
成三棋的棋盘上有很多条线段,只能在线段交叉点上放入棋子。我们可以用坐标系来描述棋盘:
如果一条线段上的三个交叉点都被同一玩家的棋子占据的话,则称这条线段被该玩家 成三。现在,小红和小明两人在游戏平台上下棋,其中小红的棋子是黑色的。请你帮小红计算他成三的线段数。
样例对应的棋盘如下:
输入第一行两个整数 n,m(3≤n,m≤9),n 表示小红的棋子数,m 表示小明的棋子数。
接下来 n 行输入小红的棋子坐标。
接下来 m 行输入小明的棋子坐标。
输入保证坐标合法,并且棋子之间不重合。
输出小红成三的线段数。
6 3 -1 0 -2 0 -3 0 -1 -1 -1 1 1 0 0 2 0 3 2 2
2
直接暴力枚举
package 计蒜之道初赛第一场;
import java.util.Scanner;
public class 计蒜之道 {
/**
* @param args
*/
static int map[][]=new int[200][200];
public static void main(String[] args) {
// TODO Auto-generated method stub
Scanner scan=new Scanner(System.in);
int n,m;
int ans=0;
int t;
while(((n=scan.nextInt())!=0)&&((m=scan.nextInt())!=0)){
ans=0;
for(int i=0;i<200;i++){
for(int j=0;j<200;j++){
map[i][j]=0;
}
}
for(int i=0;i
阿里“天池”竞赛平台近日推出了一个新的挑战任务:对于给定的一串 DNA 碱基序列 t,判断它在另一个根据规则生成的 DNA 碱基序列 s 中出现了多少次。
首先,定义一个序列 w:
wi={b,(wi−1+a)modn,i=0i>0
接下来,定义长度为 n 的 DNA 碱基序列 s(下标从 0 开始):
si=⎩⎪⎪⎪⎨⎪⎪⎪⎧A,T,G,C,(L≤wi≤R)∧(wi mod 2=0)(L≤wi≤R)∧(wi mod 2=1)((wi<L)∨(wi>R))∧(wi mod 2=0)((wi<L)∨(wi>R))∧(wi mod 2=1)
其中 ∧ 表示“且”关系,∨ 表示“或”关系,a mod b 表示 a 除以 b 的余数。
现给定另一个 DNA 碱基序列 t,以及生成 s 的参数 n,a,b,L,R,求 t 在 s 中出现了多少次。
数据第一行为 5 个整数,分别代表 n,a,b,L,R。第二行为一个仅包含A
、T
、G
、C
的一个序列 t。
数据保证 0<a<n, 0≤b<n, 0≤L≤R<n, ∣t∣≤106,a,n 互质。
对于简单版本,1≤n≤106;
对于中等版本,1≤n≤109,a=1;
对于困难版本,1≤n≤109。
输出一个整数,为 t 在 s 中出现的次数。
对于第一组样例,生成的 s 为TTTCGGAAAGGCC
。
13 2 5 4 9 AGG
1
103 51 0 40 60 ACTG
5
#include
#include
typedef long long ll;
ll n,a,b,L,R,ans;
char ts[1010101];
int f[1001000];
char make(int wi)
{
if(L<=wi&&wi<=R)
{
if(wi%2==0)
return 'A';
else
return 'T';
}
else
{
if(wi%2==0)
return 'G';
else
return 'C';
}
}
void getfail(char p[],int f[]) //字符串p自我匹配
{
int len=strlen(p);
f[0]=f[1]=0;
for(int i=1;i