自定义博客皮肤VIP专享

*博客头图:

格式为PNG、JPG,宽度*高度大于1920*100像素,不超过2MB,主视觉建议放在右侧,请参照线上博客头图

请上传大于1920*100像素的图片!

博客底图:

图片格式为PNG、JPG,不超过1MB,可上下左右平铺至整个背景

栏目图:

图片格式为PNG、JPG,图片宽度*高度为300*38像素,不超过0.5MB

主标题颜色:

RGB颜色,例如:#AFAFAF

Hover:

RGB颜色,例如:#AFAFAF

副标题颜色:

RGB颜色,例如:#AFAFAF

自定义博客皮肤

-+
  • 博客(53)
  • 收藏
  • 关注

原创 hdu 2502

昨天找出来的二进制数1出现的规律今天又遇到这样的题0位上每2个数后1个数有1,,即奇数1位上每4个数后2个有1,2位上每8个数后4个有1,.......。。。。。。。。。。。。。。#includeint a[21],b[21];int find(int n)//0到n共出现多少个1{ int i; n=n+1; int

2013-05-25 12:00:13 926

原创 hdu 4548

水题,,打表 #includeint a[1000001],b[40001];int main(){ int i,j,n,m,k,sum,num,t,c,d,op=1; num=0; for(i=2;i<=1000000;i++) { if(a[i]==1)continue; k=i;sum

2013-05-25 11:02:24 718

原创 hdu 4550

每取一个数字尽量把小数字往左放,当遇到0时要在后面的卡片找不大于首位的卡片,如果找到,就把0放到左边(标记该卡片的位置),否则放右边,注意:第一个数字可能就为0.#include#includechar s[110],str[210];int main(){ int i,j,n,k,t,len; char *p

2013-05-25 10:55:47 1239

原创 hdu 4552

hdu3336一样的题目kmp+dp可以做.队友的思路,开一个数组记录与前一个字符相等的下表,每次只需比较与上个字符相等下表+1的字符是否相等#include#includeint a[100001];int main(){ int i,j,k,p,len; char s[100001]; while(scanf("%s",s)!=-1) {

2013-05-25 08:15:10 1053

原创 hdu 4554

水#includeint swap(int a){ int flag=1,sum; if(a<0){flag=-1;a=-a;} sum=0; while(a%10==0) { a/=10; } while(a) { sum=sum*10+a%10;

2013-05-24 20:32:08 797

原创 hdu 4556

//每一行增加的个数是欧拉函数的2倍#include#define N 1000001int a[N],b[N];int main(){ int i,j,n; __int64 sum; for(i=2;i<N;i++) a[i]=i; for(i=2;i<N;i++) { if(b[i]==1)continue; a[i]=i-1; for(j=i

2013-05-24 20:30:44 731

原创 2013 南京邀请赛 C - Count The Carries

题意是a+,,,,,+b,在二进制计算中有多少次进位,只要统计一下从a~b所有数位上1的和就可以了写了前十的二进制数,发现了规律,0位上每2个数后1个数有1,,即奇数1位上每4个数后2个有1,2位上每8个数后4个有1,.......。。。。。。。。。。。。。。#include#includeint numa[70],n

2013-05-24 18:23:53 1502

原创 hdu 1018

一:log10(n!)=log10(1*2*3…*n)=log10(1)+log10(2)+…+log10(n)二:n! = sqrt(2*π*n) * ((n/e)^n) * (1 +1/(12*n) + 1/(288*n*n) + O(1/n^3))π = acos(-1)=3.1415927;e = exp(1)=2.718281828459;两边对10取对数忽略log1

2013-05-24 13:30:15 729

原创 hdu 4545

直接遍历,不能转换就删除#include#includeint link[30][30];int main(){ int i,j,len1,len2,n,t,op=1; char s1[1100],s2[1100],ch1[2],ch2[2]; scanf("%d",&t); while(t--) { memset(link,0,s

2013-05-24 12:49:33 853

原创 hdu 1254

每次都要判断人能不能走到箱子的一边,然后推箱子dp[i][j][k]记录从k方向推到i,j的最小格数         #include#include#include#define inf 0x3fffffffusing namespace std;int dir[4][2]={0,1,1,0,0,-1,-1,0};int map

2013-05-23 17:19:12 850

原创 hdu1798

贪心要想减少的分数最小,所以要在最后完成时间之前把扣分最多的要完成,所以按照扣除分数的大小排序,这里有个问题,就是排完序后面的规定时间可能小于前边的,选择前边作业的完成时间要尽量大,为后面的作业留下时间。#include#include#includeint time[1010];struct op{ int t,cont;}p[101

2013-05-23 14:47:48 936

原创 hdu 2391

直接遍历#include#includeint map[1010][1010],dp[1010][1010];int main(){ int i,j,n,m,t,op=1; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j

2013-05-23 13:38:55 982

原创 hdu 3485

记录后两位,共有4种情况00->001->110->211->3;dp[i][0]=dp[i-1][0]+dp[i-1][2];dp[i][1]=dp[i-1][0];dp[i][2]=dp[i-1][1]+dp[i-1][3];dp[i][3]=dp[i-1][1]+dp[i-1][3];#include#include#inclu

2013-05-22 15:49:54 866 1

原创 hdu 2608

先打表找出T[i]%2=1的i有哪些发现规律T[i*i]=1和T[2*i*i]=1#include#includeint main(){ int i,j,n,t,sum; scanf("%d",&t); while(t--) { scanf("%d",&n); sum=0; for(i=1;i<=n;i++) {

2013-05-22 15:39:07 777

原创 hdu 2670

如果确定了选哪几个,顺序肯定是Li大的先选,所以可以按Li排序,再像0-1背包一样依次添加      #include#include#includeint dp[1001];struct op{ int w,v;}p[1001];int cmp(const void *a,const void *b){ struct op *c

2013-05-20 22:33:32 837

原创 hdu 2512

dp[i][j]=(dp[i-1][j-1]+j*dp[i-1][j])    #includeint dp[2001][2001];int main(){ int i,j,k; for(i=1;i<=2000;i++) { dp[i][1]=1; dp[i][i]=1; } for(i=2;i<=2000;i++) { f

2013-05-20 21:13:56 793

原创 hdu 1992

找规律dp[i]=d[i-1]+4*dp[i-2]+2*(dp[i-3]+dp[i-5],,,,,,,,,)+3*(dp[i-4]+dp[i-6]+,,,,,,,);#includeint dp[1001];int main(){ dp[0]=1;dp[1]=1;dp[2]=5; int i,j,t,op,n; for(i=3;i<=1000;i++)

2013-05-17 15:55:24 756

原创 hdu 3833

暴力,有技巧,确定a[i2]的值,先从0~i2找a[i1]的值来计算a[i3]的值,当i2>n/2时,从i2~n-1找a[i3]的值来计算a[i1]的值#includeint hash[10010],a[10010];int main(){ int i,j,n,t,k,flag; scanf("%d",&t); while(t--) {

2013-05-17 14:35:25 668

原创 hdu 1394

/*分析:a[0]的逆序数为0,a[0]后边有a[0]个比a[0]小的数,将a[0]移到末尾是,a[0]的逆序数变成n-1-a[0];而a[0]个比a[0]小的数的逆序数都减1,设原序列的逆序数为sum,则新序列的逆序数sum=sum-a[0]+n-1-a[0];当m>1时,sum=sum(m-1)+n-1-a[0]-a[0];a[0]是m-1次移动后序列的首元素。*/

2013-05-17 12:04:31 664

原创 hdu 1754

简单线段树#include#define N 200002int start,end,a[N];struct tree{ int left,right,maxnum;}p[N*3];int max(int a,int b){ if(a>b)return a; return b;}void insert(int l,int r,i

2013-05-13 14:05:37 811

原创 hdu 4509

今天做hdu 1556题的时候,觉得与此题一个大牛这题思想一样就找出这题的代码//大牛的代码#include #include int s[1445];int main(){ int n; while (scanf("%d",&n) != EOF) { memset(s,0,sizeof(s)); int a,b,c,d;

2013-05-10 16:03:15 691

原创 hdu 1570

水题#includeint a[11];int main(){ int i,j,k,n,m,t; char s[2]; a[0]=1; a[1]=1; for(i=2;i<11;i++) a[i]=a[i-1]*i; scanf("%d",&t); while(t--)

2013-05-10 14:58:33 568

原创 hdu 1556

线段树,求被多少个区间覆盖#include#includestruct tree{ int left,right,count;}p[300100];void build(int l,int r,int k){ int mind=(l+r)/2; p[k].left=l; p[k].right=r; p[k].count=0; if(l==

2013-05-10 14:07:43 732

原创 hdu 1576

设A=B*k1=k2*99973+n则B*k1-k2*9973=n因为gcd(B,9973)=1;用扩展欧几里得算法可以求出x1,x2使x1*b+x2*9973=1;n*x1*b+n*x2*9973=n;求(n*x1)%9973;因为求出的x1可能有负数,(n*k%9973+9973)%9973;#include#inc

2013-05-10 10:49:17 725

原创 hdu 1555

大清早刷水题找状态#includeint main(){ int i,j,k,n,m,sum; while(scanf("%d%d",&m,&k),k||m) { sum=0; n=m; while(n>=k) { i=n/k; j=n%k; sum+=i; n=i+j; } printf("%

2013-05-10 08:12:24 655

原创 hdu 4221

贪心,,每次选限制时间最小的工作完成,完成时的时间递增,而限制的时间也是递增的,所以差值最小     #include#include#includestruct op{ int s,e;}p[100001];int cmp(const void *a,const void *b){ op *c,*d; c=(op *)a; d=

2013-05-09 22:43:01 780

原创 hdu 2425

用vis数组标记到达当前位置的最小时间,如果比最小时间大则不加入队列      #include#include#include#define inf 0x3fffffffusing namespace std;char map[30][30];int n,m,sx,sy,ex,ey;int cost[4],vis[30][30];int

2013-05-09 22:14:01 866

原创 hdu 2421

时间卡的真厉害,比赛五个小时都在优化求出A的质因子A^B=(a0^p0*a1^pq*……*an^pn)^B=a0^(B*p0)*……*an^(B*pn)aj^(B*pj)有B*pj+1个因子(aj^0,aj^1……aj^(B*pj)),因子aj^i的因子个数是i+1个;(1^3+2^3+……(B*pj+1)^3)所以M=(1^3+2^3+……(B*p0+1)^3)*(1^3+2^3

2013-05-09 19:44:02 1046

原创 hdu 1999

数据有问题,s(8)=7,s(28)=28,如果这两个数是不可摸数的程序也ac直接暴力打表#include#include#includeint mark[1002];int main(){ int i,j,k,t,n,temp; memset(mark,0,sizeof(mark)); for(i=2;i<500000;i++) {

2013-05-09 11:02:09 723

原创 hdu 2393

刷水题到500,,       #includeint main(){ int a,b,c,op=1,t; scanf("%d",&t); while(t--) { scanf("%d%d%d",&a,&b,&c); a*=a;b*=b;c*=c; printf("Scenario #%d:\n",op++); if(a==b+c||b=

2013-05-08 22:36:30 591

原创 hdu 4217

线段树模板题       #include#include#include#define N 263000struct tree{ int left,right,count;}p[N*3];void build(int l,int r,int num){ int mid=(l+r)/2; p[num].left=l; p[num].right

2013-05-08 22:17:37 745

原创 hdu 1496

poj 1480相似的题目标记前两项的和,与第三项第四项的和比较,分成两个二重循环,      #include#includeint mark1[2000001];int main(){ int a[105]; int b[4]; int i,j; j=0; int temp; for(i=1;i<=

2013-05-08 21:29:49 729

原创 hdu 1172

直接暴力,从1000到9999一个个试#include#includestruct op{ int num,x,y;}p[110];int n;int judge(int x,int y){ int a[4],b[4],a1[10],a2[10]; memset(a1,0,sizeof(a1)); memset(a2,0,sizeo

2013-05-08 12:28:43 837

原创 poj 3411

这题数据有问题,看了好多用spfa的代码下面的测试实例结果不一样都ac了6 51 2 1 10 102 3 4 10 1002 4 2 15 154 1 1 12 123 6 6 10 10费用67 用dfs,控制每个点走的次数,控制三次就可以,数据水,两次就能ac     #include#include#includein

2013-05-08 10:47:56 839

原创 poj 2503

字典树模板题目     #include#include#includestruct tree{ struct tree *son[26]; int count; char str[20];}*root;void insert(char *p,char s[]){ int i,k,j; tree *cur=root,*next

2013-05-08 08:12:33 703

原创 poj 1840

求出两项的和,跟后三项比较用int只能开数组开到12500000内存达到49000,可以用用short 省一半内存     #include#includeshort mark1[12500001];int main(){ int a[10005]; int b[5]; int i,j; j=0; int temp; f

2013-05-07 17:26:56 631

原创 hdu 2065

一看觉得是指数型母函数的题,给的数据太大,所以肯定是有规律的用指数型母函数求了23项就出现周期了    #include#includeint a[20]={20,72,72,56,60,12,92,56,0,52,12,56,40,92,32,56,80,32,52,56};int main(){ int t,op; __int64 n; wh

2013-05-07 12:14:57 806

原创 hdu 4247

#include#includeint cmp(const void *a,const void *b){ return *(int *)b-*(int *)a;}int main(){ int op=1,a[4],sum; while(scanf("%d",&a[0])!=-1) { scanf("%d%d%d",&a[1],&a[2],&a[3]); qsort(a

2013-05-06 22:21:35 627

原创 hdu 1978

dp#includeint map[110][110],dp[110][110];int main(){ int t,n,m,i,j,sum,k,p; scanf("%d",&t); while(t--) { scanf("%d%d",&n,&m); for(i=0;i<n;i++) for(j=0;j<m;j++) {

2013-05-06 21:18:43 599

原创 hdu 4224

题意非常蛋疼,读了两个小时才明白一点,还是蒙对的给出抛三个硬币,正反面朝上的次数,根据所得概率能不能用这三枚硬币抛出正反面相等的情况1:如果三枚硬币正面朝上的概率都是50%,则可以达到要求2:若果有硬币的概率大于50%,一定要有概率小于50%的才能抛出后达到50%     #includeint main(){ int i,a[3],b[3],c[3

2013-05-06 19:47:15 1290

空空如也

空空如也

TA创建的收藏夹 TA关注的收藏夹

TA关注的人

提示
确定要删除当前文章?
取消 删除