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

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 编程资源 > 编程问答 >内容正文

编程问答

[20180817]校内模拟赛

發布時間:2025/5/22 编程问答 19 豆豆
生活随笔 收集整理的這篇文章主要介紹了 [20180817]校内模拟赛 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.

T1 購物(buy)


這是題面

Solution

總共買x個第i種商品的收益fi(x)=x(ai-xbi) (小于0對0取max可以看成不買)

fi(x)-fi(x-1)=ai-(2x-1)bi

可以看成買第x個第i種商品的收益是ai-(2x-1)bi

記下每種商品買了幾個,用堆貪心即可


#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<algorithm>inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}#define MN 100005int n,k;int a[MN],b[MN];long long ans;std::pair<int,int> P;std::priority_queue<std::pair<int,int> > que;int main(){freopen("buy.in","r",stdin);freopen("buy.out","w",stdout);n=read(),k=read();register int i;for(i=1;i<=n;i++){a[i]=read();b[i]=read();que.push(std::make_pair(std::max(a[i]-b[i],0),i)); }for(i=1;i<=k;i++){P=que.top();que.pop();ans+=P.first;int num=std::max(P.first-b[P.second]*2,0);que.push(std::make_pair(num,P.second));}printf("%lld\n",ans);return 0;}




T2 集合(set)


這是題面

Solution

直接算比較難算,考慮計算倒著把集合變回去需要多少步

每輪操作可以讓一些元素減1,沒減1的元素可以兩個合并成一個

不難證明,如果一個元素非0,先減1,變成0了再合并一定最優

那么每輪操作就是把非0的數全部減1,0兩兩合并

每輪操作維護當前有幾個0,并判斷當前最小的非0數是否已經變成0,不難算出答案


#include<iostream>#include<cstdio>#include<cstring>#include<queue>#include<algorithm>inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<1)+(x<<3)+ch-'0';ch=getchar();}return x*f;}#define MN 1000005 int a[MN],n,ans,num0;int main(){freopen("set.in","r",stdin);freopen("set.out","w",stdout);n=read();register int i,j;for(i=1;i<=n;i++) a[i]=read();std::sort(a+1,a+n+1);for(i=1;i<=n;){for(j=i;a[j+1]==a[j]&&j<n;j++);ans+=a[j]-a[i-1];for(int k=1;k<=a[j]-a[i-1];k++) num0=(num0+1)/2;num0+=j-i+1;i=j+1;}for(;num0!=1;num0=(num0+1)/2,++ans);printf("%d\n",ans);return 0;}




T3 水題(water)


這是題面

Solution

對每個(i,j)求出最小的bij滿足從(i,j)出發只走不超過bij的格子能走出矩陣,bij-aij即是答案

我們把所有格子按aij排序,依次加入矩陣,當一個格子第一次與網格邊緣處于同一個連通塊時,即求出了

這個格子的bij,用一些并查集的技巧不難維護

也可以把所有網格邊緣看成一個點,再對于每兩個相鄰的格子,把他們之間的邊權設為兩者aij的較大值,

那么對這張圖求最小生成樹,最小生成樹上網格邊緣到每個點路徑上的最大值就是bij

兩個做法本質相同


這是用MST的:

#include<bits/stdc++.h>inline int read(){int x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=(x<<3)+(x<<1)+ch-'0';ch=getchar();}return x*f;}struct edge{int f,t,w;}e[91005<<1];int cnt=0;struct Edge{int t,w,nex;}E[91005<<1];int pin=0,hr[90005];inline void ins(int f,int t,int w){e[++cnt]=(edge){f,t,w};}inline void Ins(int f,int t,int w){E[++pin]=(Edge){t,w,hr[f]};hr[f]=pin;E[++pin]=(Edge){f,w,hr[t]};hr[t]=pin;}int a[305][305],b[305][305],n,m,id[305][305],f[90005],fidx[90005],fidy[90005];inline bool cmp(const edge&a,const edge&b){return a.w<b.w;}inline int getf(int x){return x==f[x]?x:f[x]=getf(f[x]);}inline void dfs(int fa,int x,int val){register int i;for(i=hr[x];i;i=E[i].nex)if(E[i].t^fa){b[fidx[E[i].t]][fidy[E[i].t]]=std::max(val,E[i].w);dfs(x,E[i].t,std::max(val,E[i].w));} }int main(){freopen("water.in","r",stdin);freopen("water.out","w",stdout);n=read();m=read();register int i,j;for(i=1;i<=n;i++) for(j=1;j<=m;j++) a[i][j]=read(),id[i][j]=(i-1)*m+j,f[id[i][j]]=id[i][j],fidx[id[i][j]]=i,fidy[id[i][j]]=j;for(i=1;i<=n;i++) for(j=1;j<m;j++) ins(id[i][j],id[i][j+1],std::max(a[i][j],a[i][j+1]));for(i=1;i<n;i++) for(j=1;j<=m;j++) ins(id[i][j],id[i+1][j],std::max(a[i][j],a[i+1][j]));for(i=1;i<=n;i++) ins(0,id[i][1],std::max(0,a[i][1])),ins(0,id[i][m],std::max(0,a[i][m]));for(j=1;j<=m;j++) ins(0,id[1][j],std::max(0,a[1][j])),ins(0,id[n][j],std::max(0,a[n][j]));std::sort(e+1,e+cnt+1,cmp);int ff,ft;for(i=1;i<=cnt;i++){if((ff=getf(e[i].f))==(ft=getf(e[i].t))) continue;f[ff]=ft;Ins(e[i].f,e[i].t,e[i].w);}dfs(-1,0,-1);for(i=1;i<=n;i++){for(j=1;j<=m;j++) printf("%d ",b[i][j]-a[i][j]);puts("");}return 0;}





Blog來自PaperCloud,未經允許,請勿轉載,TKS!

轉載于:https://www.cnblogs.com/PaperCloud/p/9495925.html

總結

以上是生活随笔為你收集整理的[20180817]校内模拟赛的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。