1. 程式人生 > >2018.8.23 練習賽

2018.8.23 練習賽

cstring 修改 三種 技術分享 flag 插入排序 onclick eve pen

  • T1 三級包
  • 題意:帶數量限制的0/1背包問題,但是容量極大,沒辦法dp。
  • 正解是分為兩部分狀態壓縮;但是實際上暴搜加上卡時(100000000)就能過
  • 技術分享圖片
     1 #include<cstdio>
     2 #include<cstdlib>
     3 #include<algorithm>
     4 #include<cstring>
     5 #include<ctype.h>
     6 using namespace std;
     7 int f[50][50];
     8 int n,m,k,w[50],ans,tot;
     9 
    10 template<typename T>
    11
    void read(T &x) { 12 char tt; 13 bool flag=0; 14 while(!isdigit(tt=getchar())&&tt!=-); 15 tt==-?(x=0,flag=1):(x=tt-0); 16 while(isdigit(tt=getchar())) x=x*10+tt-0; 17 } 18 19 20 void dfs(int num,int now,int x) { 21 ++tot; 22 ans=max(ans,x); 23
    if(tot>100000000) return; 24 if(now>k) return; 25 if(num+1<=n&&x+w[now]<=m) dfs(num+1,now+1,x+w[now]); 26 dfs(num,now+1,x); 27 } 28 int cmp(int a,int b) { 29 return a>b; 30 } 31 int main() { 32 read(n),read(m); 33 read(k); 34 for(int i=1; i<=k; i++) read(w[i]);
    35 sort(w+1,w+k+1,cmp); 36 int s=0; 37 for(int i=1; i<=n; i++) s+=w[i]; 38 if(s<=m) printf("%d\n",s),exit(0); 39 dfs(0,1,0); 40 printf("%d\n",ans); 41 }
    View Code

  • T2 三級甲
  • 題意:求給定數列中,所有區間長度為k的最小值之和
  • 通過預處理a[I]的貢獻計算每次詢問
  • 代碼:待補
  • T3 三級頭
  • 題意:給定一棵樹,完成三種操作:1.查詢點x子樹中嚴格大於y的點個數;2,指定點x為根;3.修改點x的值為y
  • 分塊,維護塊中有序,每次詢問二分查找,更新用插入排序,更新的復雜度為技術分享圖片,寫起來有點毒瘤……
  • 代碼:待補

2018.8.23 練習賽