vis

八皇后问题 java

╄→гoц情女王★ 提交于 2020-03-01 21:17:06
在棋盘上放置8个皇后,使他们互不攻击,此时每个皇后的 攻击范围为 同行 同列 同对角线 要求找出所有解 恰好每行每列放置一个皇后 如果用C[x]表示第x行皇后的列号,就成为了一个全排列问题 static int ans ; static int n ; static int [ ] C ; public static void main ( String [ ] args ) { Scanner sc = new Scanner ( System . in ) ; n = sc . nextInt ( ) ; C = new int [ n ] ; f ( 0 ) ; System . out . println ( ans ) ; } static void f ( int cur ) { if ( cur == n ) ans ++ ; else for ( int i = 0 ; i < n ; i ++ ) { int ok = 1 ; C [ cur ] = i ; for ( int j = 0 ; j < cur ; j ++ ) { //检查是否和前面的皇后冲突 //判断是否跟前面的皇后在同一列或者对角线 // 因为数组下标就是行号,所以不会在同一行 if ( C [ cur ] == C [ j ] || cur + C [ cur ] == j + C [ j

ICPC North Central NA Contest 2017 E Is-A? Has-A? Who Knowz-A?(搜索)

大兔子大兔子 提交于 2020-03-01 19:35:20
Two familiar concepts in object oriented programming are the is-a and has-a relationships. Given two classes A and B, we say that A is-a B if A is a subclass of B; we say A has-a B if one of the fields of A is of type B. For example, we could imagine an object-oriented language (call it ICPC++) with code like that in Figure E.1E.1E.1, where the class DayDayDay is-a TimeTimeTime, the class AppointmentAppointmentAppointment is both a DateBookDateBookDateBook and a ReminderReminderReminder, and class AppointmentAppointmentAppointment has-a DayDayDay. These two relationships are transitive. For

Python算法学习: 竞码编程-蓝桥杯模拟赛3题解

拈花ヽ惹草 提交于 2020-03-01 19:17:15
文章目录 A. 试题A:生存还是毁灭,这是一个问题 7’ B. 试题B:小小神枪手 开局98K 8' C. 试题C:关云长单刀会金莲,贾宝玉三打白骨精 10’ D. 试题D:抽刀断水水更流,举杯销愁愁更愁 10’ A. 试题A:生存还是毁灭,这是一个问题 7’ 描述 对于给定的文章,求出出现频率最高的字母。 对于字母的出现频率,我们定义为:该字母在整个文章中出现的次数。 例如:“To be or not to be, that is the question!” 出现频率最高的字母是:t,总共出现了77次。 对于以下莎士比亚的《哈姆雷特》经典片段,你能帮JM找到出现频率最高的字母出现的次数吗? 输出出现频率最高的字母出现的次数。 注意:字母 不区分大小写。 思路: 这里我将a-z A-Z的ascii 编码作为筛选点, 将所有的字母传入新列表然后寻找 str = ''' To be, or not to be: that is the question, Whether it's nobler in the mind to suffer The slings and arrows of outrageous fortune, Or to take arms against a sea of troubles, And by opposing end them. To die,to

浅谈几种筛法

送分小仙女□ 提交于 2020-03-01 06:35:43
杜教筛 问题一般是求 \[\sum_{i=1}^{n}f(i)\] 这样的式子。 然后我们有一种很妙的想法,那就是构造两个积性函数 \(h,g\) ,使得 \(h=f*g\) 然后尝试推一下 \(h\) 的前缀和,发现: \[ \sum_{i=1}^{n}h(i)=\sum_{i=1}^{n}\sum_{d|i}g(d)\cdot f(\frac{i}{d})\\=\sum_{d=1}^{n}g(d)\cdot\sum_{i=1}^{\lfloor\frac{n}{d}\rfloor}f({i}) \] 如果记 \(S(n)=\sum_{i=1}^nf(i)\) ,那么就可以写成: \[\sum_{i=1}^{n}h(i)=\sum_{d=1}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor)\] 把 \(d=1\) 提出来,得到我们想要的式子: \[g(1)S(n)=\sum_{i=1}^{n}h(i)-\sum_{d=2}^{n}g(d)\cdot S(\lfloor\frac{n}{d}\rfloor)\] 那么如果 \(h\) 的前缀和我们可以在一个比较优秀的时间复杂度内求出,则后面那一部分的时间复杂度在进行 整除分块 后,可以达到一个优秀的时间复杂度 \(O(n^{\frac{2}{3}})\) 。 一些题目 51nod1244 题意:

洛谷p1075素数打表

倖福魔咒の 提交于 2020-03-01 04:07:03
已知正整数n是两个不同的质数的乘积,试求出两者中较大的那个质数。 n<2e9,打个1e5的素数表就够了 #include <iostream> #include <cstdio> #include <cstring> using namespace std; const int maxn=1e5+100; bool vis[maxn]; int prime[maxn]; int cnt; void getprime(); int main() { getprime(); int n; while(scanf("%d",&n)!=EOF) { int ans; for(int i=0;i<cnt;i++) if(n%prime[i]==0) { ans=n/prime[i]; break; } cout<<ans<<endl; } return 0; } void getprime() { memset(vis,0,sizeof(vis)); cnt=0; for(int i=2;i<maxn;i++) { if(!vis[i]) prime[cnt++]=i; for(int j=0;j<cnt&&i*prime[j]<maxn;j++) { vis[prime[j]*i]=true; if(i%prime[j]==0) break; } } } 来源: CSDN 作者:

Tree and Queries CodeForces - 375D

别来无恙 提交于 2020-02-28 23:31:24
#include<bits/stdc++.h> using namespace std; typedef long long ll; typedef unsigned long long ull; const int maxn = 1e6; int col[maxn]; int num[maxn]; int vis[maxn]; int idx,h[maxn],e[maxn],ne[maxn]; int tl[maxn],tr[maxn]; struct query{ int l,r,id,k; }a[maxn]; void add(int a,int b){ e[idx]=b; ne[idx]=h[a]; h[a]=idx++; } void dfs(int u,int fa){ //子树对应的dfs序的左区间 tl[u]=++idx; num[idx]=col[u]; for(int i=h[u];~i;i=ne[i]){ if(e[i]!=fa) dfs(e[i],u); } //子树对应的dfs序的右区间 tr[u]=idx; } int sz; bool cmp(query a,query b){ if(a.l/sz!=b.l/sz) return a.l<b.l; return a.r<b.r; } int lowbit(int x){ return x&-x; }

数据结构-图的最短路径之Djikstra算法(迪杰斯特拉算法)

三世轮回 提交于 2020-02-28 21:58:09
一. Djikstra算法定义 形式: 用来解决单源最短路径的问题,即给出图G和起点s,通过算法到达每个顶点的最短距离。 基本思想: 对图G(V, E)设置集合S, 存放已被访问的顶点,然后每次从集合V-S中选择与起点s的最短距离最小的一个顶点u,访问并加入集合S。之后,令顶点u为中介点, 优化起点和所有的从u能到达的顶点v之间的最短距离。这样的操作执行n(顶点的个数)次。 伪代码: //G为图, 一般设置为全局变量,数组d为源点到达各点的最短路径长度,s为起点 Djikstra(G, d[], s){ 初始化 for(循环n次){ u = 是d[u]最小的还未被访问的顶点的标号 记u已被访问 for(从u出发能到达的所有顶点v){ if(v未被访问&&以U为中介使得s到顶点v的最短距离d[v]更优){ 优化d[v] } } } } 二、具体实现 1. 邻接矩阵版 const int MAXV = 1000;//最大顶点数 const int INF = 10000000000;//设INF为一个很大数 //适用于点数不大的情况 int n, G[MAXV][MAXV]; int d[MAXV]; bool vis[MAXV]; void Dijkstra(int s){ fill(d, d+MAXV, INF); d[s] = 0; for(int i = 0; i < n; i

最小生成树计数

情到浓时终转凉″ 提交于 2020-02-28 04:53:57
Minimum Spanning Tree http://acm.hdu.edu.cn/showproblem.php?pid=4408 模板题 1 #include<cstdio> 2 #include<cstring> 3 #include<queue> 4 #include<stack> 5 #include<algorithm> 6 #define mt(a,b) memset(a,b,sizeof(a)) 7 using namespace std; 8 typedef __int64 LL; 9 class MinST_count { ///最小生成树计数o(~=MV^3)+o(MElogME) 10 typedef int typec;///边权的类型 11 typedef LL typer;///返回值类型 12 static const int ME=1024;///边的个数 13 static const int MV=128;///点的个数 14 struct E { 15 int u,v; 16 typec w; 17 friend bool operator <(E a,E b) { 18 return a.w<b.w; 19 } 20 } e[ME]; 21 typer mod,ans,mat[MV][MV]; 22 int n,le,fa[MV],ka

51nod Bash游戏(V1,V2,V3,V4(斐波那契博弈))

不问归期 提交于 2020-02-28 04:51:57
Bash游戏V1 有一堆石子共同拥有N个。 A B两个人轮流拿。A先拿。每次最少拿1颗。最多拿K颗。拿到最后1颗石子的人获胜。如果A B都很聪明,拿石子的过程中不会出现失误。给出N和K,问最后谁能赢得比赛。 比如N = 3。K = 2。不管A怎样拿,B都能够拿到最后1颗石子。 Input 第1行:一个数T。表示后面用作输入測试的数的数量。(1 <= T <= 10000) 第2 - T + 1行:每行2个数N,K。中间用空格分隔。(1 <= N,K <= 10^9) Output 共T行。假设A获胜输出A,假设B获胜输出B。 Input演示样例 4 3 2 4 2 7 3 8 3 Output演示样例 B A A B 解题思路: 假设是(k+1)的整数倍。先手取不论什么一个1~k内的数x。后手都能够取(k+1-x)个石子,于是k+1的整数倍是先手的必败态,同理,不是k+1的整数倍时,先手能够取n%(k+1)个石子。从而使后手必败。 代码: #include <iostream> #include <cstdio> #include <cstring> #include <algorithm> using namespace std; int main() { int n,k,t; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&k);

little tricks

时间秒杀一切 提交于 2020-02-27 13:07:39
浮点数比较 const double eps = 1e-8; equal : fabs(a,b) < eps select sort for(int i =0; i < n; i++{ int k = i; for(int j = i; j< n; j++){ if(A[j] < A[k]) k = j; swap(A[k],A[i]) insert sort void insert_sort(int A[], int n){ for(int i = 1; i< n; i++){ int tmp = A[i], j = i; while(j > 0 && A[j-1] >tmp){ A[j] = A[--j]; } A[j]= tmp; } } binary_search int binary_search(int A[], int left, int right, int val){ int mid; while(left < right){ mid = left + (right - left)>>1;//移位 if(A[mid]>= val)right = mid -1;// else left = mid +1; } return (A[left] == val)? left: -1; lower_bound:找第一个>= val 的值位置,即lower_bound int