D1 模拟赛
T1 note 數(shù)組開小 菜的真實 60分
題目大意:
一個字符串 分成若干段 使每段內(nèi)都沒有重復(fù)的字符 求最少的段數(shù)
思路:
可以貪心
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 601010 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 char ch[MAXN]; 21 int n,ans,hsh[30]; 22 int main() 23 { 24 freopen("note.in","r",stdin); 25 freopen("note.out","w",stdout); 26 scanf("%s",ch+1); 27 int n=strlen(ch+1); 28 for(int i=1;i<=n;i++) 29 { 30 if(hsh[ch[i]-'a']) {memset(hsh,0,sizeof(hsh));ans++;} 31 hsh[ch[i]-'a']=1; 32 } 33 printf("%d",ans+1); 34 } View Code?
T2 work 順利a掉
題目大意:
一個數(shù)列A 取一些數(shù) 不能取連續(xù)k個數(shù) 求取的數(shù)的最大值
思路:
把問題轉(zhuǎn)化為k個里面必須取一個 求取的數(shù)的最小值
可以使用單調(diào)隊列優(yōu)化dp
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 201010 12 using namespace std; 13 inline ll read() 14 { 15 ll x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 ll n,k,a[MAXN],dp[MAXN],q[MAXN],l,r,s,ans=inf; 21 int main() 22 { 23 freopen("work.in","r",stdin); 24 freopen("work.out","w",stdout); 25 n=read(),k=read(); 26 for(int i=1;i<=n;i++) a[i]=read(),s+=a[i]; 27 q[l=r=1]=0; 28 for(int i=1;i<=n;i++) 29 { 30 while(l<r&&q[l]<i-k) l++; 31 dp[i]=dp[q[l]]+a[i]; 32 while(l<r&&dp[i]<dp[q[r]]) r--; 33 q[++r]=i; 34 } 35 ans=dp[n]; 36 for(int i=n-k+1;i<n;i++) 37 ans=min(ans,dp[i]); 38 printf("%lld",s-ans); 39 } View Code?
T3 cave 在熊神的幫助下a掉
題目大意:
一棵樹 每條邊有邊權(quán)x 走該條邊會花費x點能量 可以重復(fù)走一條邊 并會消耗2*x點能量
q次詢問 每次詢問k點能量可以最多走過多少個不同的點
思路:
首先可以想到dp i j 0/1 表示第i個點 用j點能量 進(jìn)入子樹是否回到i點 表示可以走過的最多不同點的個數(shù)
發(fā)現(xiàn)能量可能很大 就把 j 和dp表達(dá)的值調(diào)換
dp i j 0/1 表示第i個點 走j個不同點 進(jìn)入子樹是否回到i點 花費的最少能量
然后對于每個子樹做背包
方程見代碼
1 #include<iostream> 2 #include<cstdio> 3 #include<cmath> 4 #include<cstdlib> 5 #include<cstring> 6 #include<algorithm> 7 #include<vector> 8 #include<queue> 9 #define inf 2139062143 10 #define ll long long 11 #define MAXN 530 12 using namespace std; 13 inline int read() 14 { 15 int x=0,f=1;char ch=getchar(); 16 while(!isdigit(ch)) {if(ch=='-') f=-1;ch=getchar();} 17 while(isdigit(ch)) {x=x*10+ch-'0';ch=getchar();} 18 return x*f; 19 } 20 int n,fst[MAXN],nxt[MAXN<<1],to[MAXN<<1],val[MAXN<<1],cnt; 21 int sz[MAXN],dp[MAXN][MAXN][2],t[MAXN][2]; 22 void add(int u,int v,int w) {nxt[++cnt]=fst[u],fst[u]=cnt,to[cnt]=v,val[cnt]=w;} 23 void dfs(int x,int fa) 24 { 25 sz[x]=1; 26 for(int i=fst[x];i;i=nxt[i]) 27 if(to[i]!=fa) {dfs(to[i],x);sz[x]+=sz[to[i]];} 28 } 29 void dfs(int x) 30 { 31 dp[x][1][1]=dp[x][1][0]=0; 32 for(int i=fst[x];i;i=nxt[i]) 33 if(sz[to[i]]<sz[x]) dfs(to[i]); 34 for(int j=fst[x];j;j=nxt[j]) 35 if(sz[to[j]]<sz[x]) 36 { 37 memset(t,127,sizeof(t)); 38 for(int i=2;i<=sz[x];i++) 39 for(int k=1;k<=min(sz[to[j]],i-1);k++) 40 { 41 t[i][0]=min(t[i][0],min(dp[x][i-k][1]+dp[to[j]][k][0]+val[j],dp[x][i-k][0]+dp[to[j]][k][1]+2*val[j]));//從這個該兒子的子樹里出來進(jìn)入別的兒子的樹或從別的兒子的樹出來進(jìn)入該兒子的樹 42 t[i][1]=min(t[i][1],dp[x][i-k][1]+dp[to[j]][k][1]+2*val[j]);//需要從以兒子為根的樹出來并從別的子樹出來 43 } 44 //t數(shù)組因為忘記了背包要倒著dp導(dǎo)致需要t數(shù)組來保證不會改變被用到的dp值 45 for(int i=1;i<=sz[x];i++) 46 dp[x][i][0]=min(t[i][0],dp[x][i][0]),dp[x][i][1]=min(t[i][1],dp[x][i][1]); 47 } 48 } 49 int main() 50 { 51 freopen("cave.in","r",stdin); 52 freopen("cave.out","w",stdout); 53 n=read();int a,b,c,res; 54 for(int i=1;i<n;i++) {a=read(),b=read(),c=read();add(a,b,c);add(b,a,c);} 55 int T=read();memset(dp,127,sizeof(dp)); 56 dfs(1,0);dfs(1); 57 while(T--) 58 { 59 a=read(),res=0; 60 for(int i=n;i>=1;i--) if(dp[1][i][0]<=a) {res=i;break;} 61 printf("%d\n",res); 62 } 63 } View Code?轉(zhuǎn)載于:https://www.cnblogs.com/yyc-jack-0920/p/9299824.html
總結(jié)
- 上一篇: 博弈论笔记--03--迭代剔除和中位选民
- 下一篇: [jQuery] 判断复选框checkb