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

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 >

170815模拟赛

發(fā)布時(shí)間:2025/3/8 28 豆豆
生活随笔 收集整理的這篇文章主要介紹了 170815模拟赛 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

得分

預(yù)估:200

實(shí)測(cè):100

詳情

T1 第K小數(shù) number

思路

我當(dāng)時(shí)想的是兩層二分,一層二分ans,然后枚舉n,二分m;

理論時(shí)間復(fù)雜度O(nlogmlog1e18+nlongn+mlogm);

然后二分寫掛了。。。

師傅的題解給出的思路是二分ans,正序枚舉n,倒序枚舉m;

因?yàn)閚和m已經(jīng)排好序,所以時(shí)間復(fù)雜度為O((n+m)log1e18+nlogn+mlogm);

因?yàn)閿?shù)據(jù)規(guī)模較小,所以在常數(shù)上比我稍優(yōu);

而且好寫,所以我采用后者;

代碼實(shí)現(xiàn)

1 #include<cstdio> 2 #include<algorithm> 3 #define LL long long 4 using namespace std; 5 const int maxn=2e5+1; 6 LL n,m,k,ans; 7 LL x[maxn],y[maxn]; 8 int main(){ 9 freopen("number.in","r",stdin); 10 freopen("number.out","w",stdout); 11 scanf("%d%d%I64d",&n,&m,&k),k--; 12 for(int i=1;i<=n;i++) scanf("%I64d",&x[i]); 13 for(int i=1;i<=m;i++) scanf("%I64d",&y[i]); 14 sort(x+1,x+n+1); 15 sort(y+1,y+m+1); 16 LL l=1,r=x[n]*y[m],mid,num; 17 int i,j; 18 while(l<=r){ 19 num=0; 20 mid=l+r>>1; 21 i=1,j=m; 22 for(i;i<=n;i++){ 23 while(1ll*x[i]*y[j]>mid) j--; 24 num+=j; 25 } 26 if(num<=k) l=mid+1; 27 if(num>k) r=mid-1; 28 } 29 printf("%I64d\n",l); 30 return 0; 31 }

T2 dwarf tower

思路

我的想法可能不太清真,不過理論上和實(shí)測(cè)都能過;//跑的也不慢;

對(duì)于m種合成方式,我建m個(gè)虛節(jié)點(diǎn);

建立合成物節(jié)點(diǎn)->虛節(jié)點(diǎn)->原料節(jié)點(diǎn)順序的單向鏈接;

跑一邊dfs;

對(duì)于普通節(jié)點(diǎn),它的花費(fèi)等于它和它所有兒子值中的最小值;

等于虛節(jié)點(diǎn),他的花費(fèi)等于它所有兒子的花費(fèi)和;

代碼實(shí)現(xiàn)

1 #include<cstdio> 2 #include<iostream> 3 const long long inf=1e9+7; 4 const int maxn=3e5+10; 5 int n,m; 6 int v[maxn]; 7 int h[maxn],hs; 8 int et[maxn],en[maxn]; 9 bool vis[maxn]; 10 void add(int k){ 11 int a,b,c; 12 scanf("%d%d%d",&a,&b,&c); 13 et[++hs]=k,en[hs]=h[a],h[a]=hs; 14 et[++hs]=b,en[hs]=h[k],h[k]=hs; 15 et[++hs]=c,en[hs]=h[k],h[k]=hs; 16 } 17 void dfs(int k){ 18 vis[k]=1; 19 for(int i=h[k];i;i=en[i]){ 20 if(!vis[et[i]]) dfs(et[i]); 21 if(k>n) v[k]=std::min(inf,0ll+v[k]+v[et[i]]); 22 else v[k]=std::min(v[k],v[et[i]]); 23 } 24 } 25 int main(){ 26 freopen("dwarf.in","r",stdin); 27 freopen("dwarf.out","w",stdout); 28 scanf("%d%d",&n,&m); 29 for(int i=1;i<=n;i++) scanf("%d",&v[i]); 30 for(int i=1;i<=m;i++) add(n+i); 31 dfs(1); 32 printf("%d",v[1]); 33 return 0; 34 }

T3 abcd

思路

完全背包;

先對(duì)數(shù)據(jù)進(jìn)行預(yù)處理,解決負(fù)數(shù)問題;

然后跑背包DP;

f[j]=max_(f[j],f[j-w[i]]+v[i]);

代碼實(shí)現(xiàn)

1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 const int maxn=210; 5 int n,m,num,ans; 6 int a[maxn],b[maxn],c[maxn],d[maxn]; 7 int f[101000],w[3010],v[3010]; 8 int main(){ 9 freopen("abcd.in","r",stdin); 10 freopen("abcd.out","w",stdout); 11 memset(f,-127/3,sizeof(f)),f[0]=0; 12 scanf("%d",&n); 13 for(int i=1;i<=n;i++){ 14 scanf("%d%d%d%d",&a[i],&b[i],&c[i],&d[i]); 15 b[i]-=a[i],ans+=a[i]*d[i],m-=a[i]*c[i]; 16 } 17 for(int i=1;i<=n;i++){ 18 for(int j=1;j<=b[i];j<<=1) 19 w[++num]=c[i]*j,v[num]=d[i]*j,b[i]-=j; 20 if(b[i]) w[++num]=b[i]*c[i],v[num]=b[i]*d[i]; 21 } 22 for(int i=1;i<=num;i++) 23 for(int j=m;j>=w[i];j--) 24 f[j]=std::max(f[j-w[i]]+v[i],f[j]); 25 printf("%d\n",f[m]+ans); 26 return 0; 27 }

?

轉(zhuǎn)載于:https://www.cnblogs.com/J-william/p/7380177.html

總結(jié)

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

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