随笔分类 - HDU
摘要:模拟BFS搜索对于一个将要爆炸的点,可能同时由多个点引起。 1 /* 2 模拟搜索过程 3 */ 4 #include 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 const int maxn = 8;11 int mat[ maxn ][ maxn ];12 int mytime[ maxn ][ maxn ];13 const int dx[] = {0,0,-1,1};14 const int dy[] = {1,-1,0,0};15 struct node{16 int x,y,ti,...
阅读全文
摘要:一开始TLE了。。。 1 /* 2 模拟 3 */ 4 #include 5 #include 6 const int maxn = 10005; 7 typedef __int64 int64; 8 int64 a[ maxn ]; 9 int main(){10 int64 k;11 int n,k1,k2 ;12 int T;13 scanf("%d",&T);14 int ca = 1;15 while( T-- ){16 scanf("%d%d%d%I64d",&n,&k1,&k2,&k);17 int6
阅读全文
摘要:题意很简单。一次最多多切出一条边!其余的就没什么好说的了 1 import java.util.*; 2 import java.math.*; 3 public class Main{ 4 public static void main( String[] args ){ 5 Scanner cin = new Scanner( System.in ); 6 BigInteger n,m,p; 7 while( cin.hasNext() ){ 8 n = cin.nextBigInteger(); 9 ...
阅读全文
摘要:简单。 1 #include 2 #include 3 const int maxn = 1000006; 4 int a[ maxn ]; 5 int main(){ 6 int ca; 7 scanf("%d",&ca); 8 while( ca-- ){ 9 int n;10 scanf("%d",&n);11 for( int i=0;i=a[ i ] ){17 a[ i+1 ] -= a[ i ];18 a[ i ] = 0;19 ...
阅读全文
摘要:题意:在一个序列中找出最长的某个序列。找出的序列满足题中的条件。关键:对于 第 i 个位置上的数,要知道与之相隔至少d的位置上的数的大小。可以利用线段树进行统计,查询。更新的时候利用dp的思想。 1 /* 2 统计某一段内有多少比aim小的数据 3 在更新的时候利用了dp的思想。 4 */ 5 #include 6 #include 7 #include 8 #include 9 using namespace std;10 const int maxn = 100005;11 struct node{12 int sum,l,r;13 }anode[ maxn1 )64 ...
阅读全文
摘要:一种比较挫的写法 1 /* 2 模拟 3 */ 4 #include 5 #include 6 #include 7 #include 8 #include 9 #include10 #include11 #include12 #include13 using namespace std;14 const int maxn = 105;15 16 int cmp( int a,int b ){17 return a>b;18 }19 20 int main(){21 int ca;22 scanf("%d",&ca);23 while( ca-- ){24 .
阅读全文
摘要:模拟! 1 /* 2 计算过了D天后的日期 3 之前D天的日期 4 */ 5 #include 6 int judge_year( int year ){ 7 if( (year%4==0&&year%100!=0)||(year%400==0) ) 8 return true; 9 else 10 return false; 11 } 12 int judge_month( int mon ){ 13 if( mon==1||mon==3||mon==5||mon==7||mon==8||mon==10||mon==1...
阅读全文
摘要:1 #include 2 int fast_pow( int a,int b,int mod ){ 3 int res = 1; 4 while( b>=1 ){ 5 if( b%2==1 ){ 6 res = res*a%mod; 7 } 8 a = a*a%mod; 9 b/=2;10 }11 return res;12 }13 int main(){14 int n;15 while( ~scanf("%d",&n) ){16 if( ...
阅读全文
摘要:题意:找到一个这样的图,在这个图中,最多有一个环。使得所有的边的和最大。贪心+并查集首先把边排序,然后开始分类讨论。对于边ab(含有两个端点ab)如果a,b是属于两个不同的集合 a b 是两个环中的点,则放弃ab a b 有一个是环,则把环当做另一个的祖先,之后在回溯祖先的时候,能找到该点是在某个环中。。。。。 1 /* 2 找到一个图,使得每一个连通分量最多有一个环 3 */ 4 #include 5 #include 6 #include 7 #include 8 using namespace std; 9 const int maxn = 10005;10 const int ...
阅读全文
摘要:dp[ i ]表示该状态下得所需花费。 1 /* 2 状态压缩dp 3 dp[i] = min( dp[ i-j ]+cost[ j ] ); 4 由i-j的状态转到i的状态 5 */ 6 #include 7 #include 8 #include 9 #include10 #include11 using namespace std;12 const int maxn = 20;13 const double inf = 99999999.0;14 const int maxm = (11&&cntinf ) continue;50 for( int j=0;jdi...
阅读全文
摘要:可用tarjan来做。。。 1 /* 2 lca+tarjan 3 */ 4 #include<stdio.h> 5 #include<string.h> 6 #include<stdlib.h> 7 #include<algorithm> 8 #include<iostream> 9 #include<queue> 10 #include<map> 11 #include<math.h> 12 using namespace std; 13 typedef long long ll; 14 //t
阅读全文
摘要:有向边!!! 1 #include<stdio.h> 2 #include<string> 3 #include<map> 4 #include<stdlib.h> 5 #include<iostream> 6 #include<algorithm> 7 #include<math.h> 8 using namespace std; 9 const int maxn = 200005; 10 struct node{ 11 int from,to,next,val; 12 }edge[ maxn<<
阅读全文
摘要:题意是个大坑。。。只要,保证有且只有一个人的入度是0,就yes。。 1 #include<stdio.h> 2 #include<string> 3 #include<map> 4 #include<iostream> 5 #include<algorithm> 6 using namespace std; 7 const int maxn = 2005; 8 int ind[ maxn ]; 9 struct node{ 10 int u,next; 11 }edge[ maxn*2000 ]; 12 int cnt,head[ m
阅读全文
摘要:先判断是否存在环。。然后dfs出每个人比几个人要求高。。 1 ///* 2 //拓扑 3 //*/ 4 #include<stdio.h> 5 #include<string.h> 6 const int maxn = 10105; 7 int ind[ maxn ],add[ maxn ],vis[ maxn ]; 8 struct node{ 9 int u,next;10 }edge[ maxn<<2 ];11 int cnt,head[ maxn ];12 void init(){13 cnt = 0;14 memset( add,0,sizeof(
阅读全文
摘要:1 /* 2 用线段树不会写 3 4 dp 5 l[ i ]:表示左边>=h[i]的位置pos 6 */ 7 #include<stdio.h> 8 #include<algorithm> 9 using namespace std;10 typedef long long int64;11 const int maxn = 100005;12 int64 h[ maxn ],l[ maxn ],r[ maxn ];13 int main(){14 int n;15 while( scanf("%d",&n)==1 ){16 if( n
阅读全文
摘要:和以前的背包方程有点不同。注意:一张支票上可能有多个可能相同的项目这是AC的代码。View Code 1 /* 2 首先dp[i][j]:表示从前i个中选择j个,则转移方程为: 3 dp[i][j] = max( dp[ i-1 ][ j ](不选),dp[ i-1 ][ j-1 ]+val[i](选) ); 4 5 一开始用dp[ i ][ j ]:表示从前i个中选某些个得到不超过j的最大值,发现过不了。。。只好看别人代码。。。 6 */ 7 8 #include<stdio.h> 9 #include<string.h>10 #include<stdlib.h
阅读全文
摘要:View Code 1 /* 2 dp[ i ]:偷钱i而不被抓的最大概率(因为要使得被抓的概率最小) 3 开始想把dp[i]定义为概率为i的最大价值,因为把i放大了100,不过还是不够。 4 然后看题解才明白要转化,dp[i]:偷i这么多钱的最大不被捕的概率,也就是不被抓的最小概率 5 */ 6 #include<stdio.h> 7 #include<string.h> 8 #include<algorithm> 9 using namespace std;10 const int maxn = 10015;11 double dp[ maxn ];12
阅读全文
摘要:带权的并查集View Code 1 /* 2 带权值的并查集 3 ps:对于两个不在同一个集合里面的两个元素,把父节点接在一起即可 4 */ 5 #include<stdio.h> 6 #include<string.h> 7 #include<stdlib.h> 8 #include<algorithm> 9 #include<iostream>10 #include<queue>11 #include<map>12 #include<math.h>13 using namespace std;1
阅读全文
摘要:简单题。明白闰年是什么。。View Code 1 /* 2 简单题 3 闰年的判断: 4 year%4==0&&(year%100!=0||year%400==0) 5 */ 6 #include<stdio.h> 7 #include<string.h> 8 #include<stdlib.h> 9 #include<iostream>10 #include<queue>11 #include<stack>12 #include<algorithm>13 #include<map>
阅读全文
摘要:虽然题意简单,但是注意的细节还是不少。1、必须满足能刚好付这么多钱。2、尽可能先把1毛的用完3、在2的基础上把5毛的用完4、用10的时候,保证sum是10的倍数,否则先去掉5个1毛,没有1毛再去5毛。。。View Code 1 #include<stdio.h> 2 int main(){ 3 int sum,x1,x5,x10; 4 int a,b,c; 5 while( scanf("%d%d%d%d",&sum,&x1,&x5,&x10)!=EOF && ( sum||x1||x5||x10) ){ 6 a
阅读全文