日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

D1 模拟赛

發(fā)布時間:2024/7/19 编程问答 32 豆豆
生活随笔 收集整理的這篇文章主要介紹了 D1 模拟赛 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

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é)

以上是生活随笔為你收集整理的D1 模拟赛的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。