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

歡迎訪問 生活随笔!

生活随笔

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

编程问答

2017.8.12 联考题

發布時間:2025/4/9 编程问答 26 豆豆
生活随笔 收集整理的這篇文章主要介紹了 2017.8.12 联考题 小編覺得挺不錯的,現在分享給大家,幫大家做個參考.
今天的題比(wo)較(zhi)水(zhang),好幾個大佬都AK了...... 第一題
題意
給1~n的板子,按一定順序排放,板子圍起來的地方可以盛水,問給定n和要盛的水x,輸出合法序列
n<=1e6 x<=1e13
solution 先把n放在最左邊,把n-1放在n后面,在他倆中間加數 設當前要加的高度是H,那它對總水的貢獻是 (n-1-H) 一直加到當前水==x,再把沒加的從大到小加在n-1后面 如果加完都沒有加滿水,就 -1 (根據數學歸(wo)納(bu)法(hui))
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #define ll long long 5 using namespace std; 6 7 int n; 8 ll sum; 9 int a[1000066],cnt,flag[1000066]; 10 11 int main(){ 12 13 //freopen("1.txt","r",stdin); 14 //freopen("2.txt","w",stdout); 15 16 scanf("%d%lld",&n,&sum); 17 18 if(n<3) 19 { 20 if(sum!=0) 21 { 22 printf("-1"); 23 return 0; 24 } 25 else 26 { 27 for(int i=1;i<=n;++i) 28 printf("%d ",i); 29 return 0; 30 } 31 } 32 33 a[++cnt]=n;flag[n]=1; 34 for(int i=1;i<=n-2;++i) 35 { 36 if(sum==0) 37 break; 38 if((n-1-i)<=sum) 39 { 40 a[++cnt]=i; 41 flag[i]=1; 42 sum-=(n-1-i); 43 } 44 } 45 if(sum!=0) 46 printf("-1"); 47 else 48 { 49 a[++cnt]=n-1; 50 flag[n-1]=1; 51 for(int i=n;i>=1;--i) 52 if(!flag[i]) 53 a[++cnt]=i; 54 for(int i=1;i<=cnt;++i) 55 printf("%d ",a[i]); 56 } 57 58 //while(1); 59 return 0; 60 } 61 第一題 第二題:
題意
給一個長度為n的序列,求其長度為k的子序列max值的和,mod1e7
n<=1e5 k<=50 solution
先把值排個序 從小到大枚舉序列max 它對答案的貢獻是 v[i]*C(i-1,k-1)
組合數直接遞推:c[n][m]=c[n-1][m]+c[n-1][m-1]
1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 #define ll long long 6 #define mem(a,b) memset(a,b,sizeof(a)) 7 using namespace std; 8 const int N=100066; 9 const int mod=1000000007; 10 11 int n,k; 12 ll a[N]; 13 ll c[N][56]; 14 ll ans; 15 16 void chu() 17 { 18 c[0][0]=1; 19 for(int i=1;i<=k;++i) 20 c[i][i]=1; 21 for(int i=1;i<N;++i) 22 c[i][0]=1; 23 24 for(int i=2;i<=k;++i) 25 for(int j=1;j<i;++j) 26 c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; 27 for(int i=k+1;i<N;++i) 28 for(int j=1;j<=k;++j) 29 c[i][j]=(c[i-1][j]+c[i-1][j-1])%mod; 30 31 /* printf("\n"); 32 for(int i=1;i<=5;++i) 33 { 34 for(int j=0;j<=i;++j) 35 printf("%lld ",c[i][j]); 36 printf("\n"); 37 } 38 printf("\n");*/ 39 } 40 41 int main(){ 42 43 //freopen("1.txt","r",stdin); 44 45 scanf("%d%d",&n,&k); 46 47 //printf("k=%d\n",k); 48 49 chu(); 50 51 /* for(int i=40;i<=45;++i) 52 printf("%lld\n",c[5555][i]);*/ 53 54 for(int i=1;i<=n;++i) 55 scanf("%lld",&a[i]); 56 57 sort(a+1,a+1+n); 58 59 for(int i=k;i<=n;++i) 60 ans=(ans+a[i]*c[i-1][k-1]%mod)%mod; 61 62 cout<<ans; 63 //while(1); 64 return 0; 65 } 第二題 第三題:
題意
給一個二叉樹,修改其中一些節點的值,使其滿足二叉搜索樹的性質,特別的左右子樹的值不能和當前節點值相等
n<=1e5
solution
先對整棵樹進行中序遍歷得到一個序列 (這么簡單我竟然2個小時都沒有想出來......)
然后問題變成了 求這個序列的最長上升子序列 設序列為f[i]
j>i f[j]>d[i]
由于不能相等 所以滿足 f[j]-f[i]>=j-i 即 f[j]-j>=f[i]-i
設 g[i]=f[i]-i
問題有轉換為求 g[i] 的最長不下降子序列
這個比較好求,直接離散g[i] 樹狀數組維護即可
#include<cstdio> #include<cstring> #include<iostream> #include<algorithm> #define ll long long #define mem(a,b) memset(a,b,sizeof(a)) #define p(x) a[x].p #define ls(x) a[x].ch[0] #define rs(x) a[x].ch[1] using namespace std; const int INF=0x7fffffff; const int N=100066;int c[N]; void add(int pos,int val) {for(int i=pos;i<N;i+=(i&(-i)) )if(c[i]<val)c[i]=val; } int qq(int pos) {int ans=-INF;for(int i=pos;i>0;i-=(i&(-i)) )if(ans<c[i])ans=c[i];return ans; }struct son {int ch[2],p; }; son a[N];int n,u,o,sum; int f[N],cnt,v[N],h[N]; int g[N];void dfs(int x) {if(x==-1)return ;dfs(ls(x));h[++cnt]=v[x];dfs(rs(x)); }struct son1 {int pos,val;friend bool operator < (son1 a,son1 b){return a.val<b.val;} }; son1 li[N];int now;void lisan() {for(int i=1;i<=n;++i){li[i].val=g[i];li[i].pos=i;}sort(li+1,li+1+n);li[0].val=-INF;for(int i=1;i<=n;++i){if(li[i].val==li[i-1].val)g[li[i].pos]=now;elseg[li[i].pos]=++now;} }int main(){mem(a,-1);scanf("%d",&n);for(int i=1;i<=n;++i)scanf("%d",&v[i]);for(int i=2;i<=n;++i){scanf("%d%d",&u,&o);p(i)=u;a[u].ch[o]=i;}dfs(1);for(int i=1;i<=n;++i)g[i]=h[i]-i;lisan();for(int i=1;i<=n;++i){f[i]=qq(g[i])+1;add(g[i],f[i]);if(sum<f[i])sum=f[i];}cout<<(n-sum);//while(1);return 0; } 第三題

轉載于:https://www.cnblogs.com/A-LEAF/p/7351378.html

總結

以上是生活随笔為你收集整理的2017.8.12 联考题的全部內容,希望文章能夠幫你解決所遇到的問題。

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