Time of Update: 2018-12-04
做法:直接狀態壓縮了,如果理解了條件期望,那這道題目就可以迎刃而解這裡要求的不是期望,而是求期望/機率#include<cstdio>#include<cstring>const int LMT=1<<20;double dp[LMT+1],p[25];int main(void){ int i,n,lim,j; double tem; while(~scanf("%d",&n)) {
Time of Update: 2018-12-04
總體上參考ccy,不說了,上代碼#include<stdio.h>#include<string.h>#include<iostream>#define LL long long#define LMTh 1997000using namespace std;int a[15][15],jz[15],total[2];LL sum[2][200000];LL state[2][200000];int Hash[LMTh];int
Time of Update: 2018-12-04
題意:有一個放入一個任意大小的蛇形陣,但是要保證蛇放得下。被蛇覆蓋的數字會被得到,求那些數字和的最大值。做法:可以發現一個規律get[n][i][j]=sum[n][i][j]-get[n-1][i+1][j+1]-mat[i+1][j],n代表蛇的大小,和以i,j為左上頂點的方陣的邊長。可是,這麼做會超記憶體,而且因具體實現方式不同,時間複雜度可以差很多。那麼,就以建立一個數組alget[LMT][LMT],一次表示以0,i,j為對角線的矩陣的所有元素之和。所以sum[n][i][j]=alg
Time of Update: 2018-12-04
題意:現在有無數的1*1*2的磚頭,要壘成一個長度為N的煙囪。磚頭可以豎起來,可以平著放,問題是當四塊磚都平f放時,題目認為可以有兩種情況。做法:用0代表空,1代表覆蓋。類比每個截面放置磚頭的情況後,可以發現不管怎麼放,1的個數總是偶數,這可以用來化簡。由於放置的特殊性,其實截面可以抽象成一個首尾可以相互影響的8位位元。如此,考慮所有情況,進行判斷。#include <cstdio>#include<cstring>#define mod
Time of Update: 2018-12-04
題意:求序列數。這個序列裡不能有連續k1個footmen還有k2個horsemen。做法:這種有固定資源,並且有離散化消耗的,一定要忘背包上靠。#include<stdio.h>#define mod 100000000#define LL long longLL dp[2][202][102];int main(void){ int n1,n2,k1,k2; int i,j,t; scanf("%d%d%d%d",&n1,&n2,&k1,&
Time of Update: 2018-12-04
題意:一個女孩整理箱子,箱子的位置不可以改變,她一次可以拿兩個或者是一個行李,女孩移動時間花費是她移動距離的平方。做法:狀態壓縮DP 還是不熟啊,要瞟一眼打大神部落格才行。/*******劃分狀態,這種題目總是以為要用DFS做,可是也不知道怎麼DFS啊。。。所以,觀察,發現只有24件物品,拿每一個物品時,你可以拿兩個,可是拿第二個物品時,受前面狀態的幹擾,有且僅有這樣一個幹擾。所以狀態壓縮吧。其實這個狀態可以無視拿東西的順序。其實這個狀態可以無視拿東西的順序,所以可以認為的假定拿完i後才能拿i+
Time of Update: 2018-12-04
這兩天都沒什麼東西做出來的../.T_T第一次接觸到逆元是11年大連的最後一題.囧啊,不會..什麼都不會,網賽z怎麼破比如: (8/2)%5 我們求a*b*c*d*e*f*g..../z 前面乘積部分LL存不下所以要一邊mod一邊乘最後處理到除z時,不一定能除盡比如前面那個例子,8/5=3,3除不盡2就乘以2%5的逆元在%52%5的逆元=2^(5-2)=8
Time of Update: 2018-12-04
題意:在圖中找簡單迴路/*************看了大神的部落格才有所感悟啊,記憶化搜尋+狀態壓縮。。。。太神了...這種複雜度,近百萬的DFS複雜度居然沒有TLE,果然經驗不足,菜鳥一隻。用狀態壓縮枚舉起點和可能經過的點。可以判定的簡單通路 i->j,存在的條數為sum(i->k)
Time of Update: 2018-12-04
題意:給定一個集合,求在用集合中的數字中最大的一個能被2,3,5整除的數。方法:能被2,5整除的末尾一定是0,能被3整除的各位元字之和也一定可以被3整除。重點是後者的判斷。首先,用sum記錄集合中數位和(貪心,數字越多越好)。然後發現,所有的整數都可以z=3*k+b表示,若兩個數x=3*k+b,y=3*k+b
Time of Update: 2018-12-04
題意:求給定去接內不重複數位和做法: 圖靈樹還是沒有學到....只要先記錄每個詢問,然後按照右邊界排序,還需要記錄每個位置之前距離它最近那個與他相等的元素的位置。再樹狀數組做一下。#include <cstdio>#include <cstring>#include <algorithm>#define lowbit(x) ((x)&-(x))typedef __int64 LL;const int LMT = 30003;using
Time of Update: 2018-12-04
好吧,這麼簡單地題目也就接了這麼久。第一次做二分,囧,二分多好的東西啊- -題目的意思是給出個具有等差數列性質的序列110100100010000…,再給出n個序號,求這n個位置上的0、1值。先把1的位置用數組確定下來,a[0]=1,a[1]=2,a[2]=4.....,然後對給出的數進行二分尋找,QuickSort。#include <iostream>//ural 1209,zisu_123#include <cstdio>using namespace
Time of Update: 2018-12-04
A水題,,,求n*m的矩形需要幾塊a*a才能覆蓋完.水題。注意要用long longint main(){ LL n,m,a; while(~scanf("%I64d%I64d%I64d",&n,&m,&a)){ LL num1=0; num1=n/a; if(n%a!=0) num1++; LL num2=0; num2=m/a;
Time of Update: 2018-12-04
做法:這種元素個數很少,而且狀態和順序有關,可以往狀態壓縮上考慮#include<cstdio>#include<cstring>const int LMT=1<<20;int dp[LMT],c[25],r[25];int max(int a,int b){return a>b?a:b;}int min(int a,int b){return a<b?a:b;}void
Time of Update: 2018-12-04
21:52:47ZOJ3487.3492.3498.3499A:#include <stdio.h>//只要考慮到結尾是11 12 13的情況就可以了 其餘的都是輸出th的。。悲劇。int main(){ int a,n; while(scanf("%d",&n)!=EOF) { while(n--) { scanf("%d",&a);
Time of Update: 2018-12-04
http://acm.zju.edu.cn/onlinejudge/showProblem.do?problemId=1110題意:小狗從S出發要在T時到達D。“X”是牆,”.”是空地,走過之後地就會下陷,不能往回走。分析:以前就看過,經典的。昨天拿出來寫,dfs函數倒是很快寫出來,但是用的不流暢,還有剪枝,有一個大概是我無法想到的啊…奇偶剪枝:Temp=(T-t)-(abs(x-endx)+abs(y-endy))(T-t) :
Time of Update: 2018-12-04
知道什麼是1 ,什麼是0.題意:求一個棋盤中最多可以放幾個十字(十字尺寸一定,寬度為一格)。做法:壓縮一下就可以了,較水,只是,2了一下。。。。#include<stdio.h>#include<string.h>int dp[105][65][65];int state[65],get[65],blo[105];int n,m,all,ret;inline int max(int a,int b){ return a>b?a:b;}void dfs(int
Time of Update: 2018-12-04
#include<cstdio>#include<cstring>const int LMT=1012;double dp[LMT][LMT],_no[LMT][LMT];void init(void){memset(dp,0,sizeof(dp));}int main(void){int s,n,i,j;while(~scanf("%d%d",&n,&s)){init();for(i=0;i<=n;i++)for(j=0;j<=s;j++)_
Time of Update: 2018-12-04
#include<stdio.h>#include<string.h>struct tt{ char str[25]; long m; long total; long b[10];};int main(){ long N,M,G; long score[15]; int i,j,l; struct tt stu[1000],temp; while(scanf("%ld",&N)!=EOF) { if(N==0) break; scanf("%ld%ld",
Time of Update: 2018-12-04
poj g++坑人大法,c++ 就過了#include<cstdio>#include<cstring>const int LMT=1012;double dp[LMT][LMT],_no[LMT][LMT];void init(void){memset(dp,0,sizeof(dp));}int main(void){int
Time of Update: 2018-12-04
http://acm.hdu.edu.cn/showproblem.php?pid=4011#include<stdio.h>int main(){ int N; int n; long a,b; int i,len; long ti[100005]; long s1,s2,s; int Case=1,flag=1; scanf("%d",&N); while(N--) {