- 博客(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关注的人