• 10-13-宀


    一年前的今天:

    我A了什么玩意:

    校门外的树

    【数组】筛法求素数

    排序

    提交记录:

    #1MYC模拟赛

    $tips:$暴力搜加剪枝。

    T1

    $Meet\, in\, Middle$,

    当发现暴搜的指数在$20acksim 40$时,尝试此方法。

    在左面搜并维护差值,在右面搜并查找差值。

    话说我用 unordered_map 套 set 过了……

    #include <unordered_map>
    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <set>
    #define N 22
    
    using namespace std;
    
    int nn,arr[N],mid,ans;
    unordered_map <int,set<int> >val;
    bool is_v[2048][2048];
    void ledfs(int nid,int pos,int atot,int btot){
    	if(nid>mid){
    		val[atot-btot].insert(pos);
    		return ;
    	}
    	ledfs(nid+1,pos<<1  ,atot         ,btot);
    	ledfs(nid+1,pos<<1|1,atot+arr[nid],btot);
    	ledfs(nid+1,pos<<1|1,atot         ,btot+arr[nid]);
    }
    void ridfs(int nid,int pos,int atot,int btot){
    	if(nid>nn){
    		if(val.find(atot-btot)!=val.end())
    			for(auto &i:val[atot-btot]){
    				if(!is_v[i][pos]){
    					is_v[i][pos]=1;
    					ans++;
    				}
    			}
    		return ;
    	}
    	ridfs(nid+1,pos<<1  ,atot         ,btot);
    	ridfs(nid+1,pos<<1|1,atot+arr[nid],btot);
    	ridfs(nid+1,pos<<1|1,atot         ,btot+arr[nid]);
    }
    int main(){
    	val.rehash(2333333);
    	scanf("%d",&nn);
    	mid=nn/2;
    	for(int i=1;i<=nn;i++)
    		scanf("%d",arr+i);
    	ledfs(1    ,0,0,0);
    	ridfs(mid+1,0,0,0);
    	printf("%d
    ",ans-1);
    }
    

    T2

    不会,咕掉了。

    T3

    暴力剪枝可过。

    正解也不正经,随机化加剪枝。

    总之剪枝就是了。

    #include <iostream>
    #include <cstring>
    #include <climits>
    #include <cstdio>
    #define N 11111
    
    using namespace std;
    
    int pn,mod,bn;
    int wi[N],dat[N],ans=INT_MAX;
    bool is_ok(int lim){
    	int nget=0,nbn=1;
    	for(int i=1;i<=pn;i++){
    		if(dat[i]>lim)return 0;
    		if(nget+dat[i]>lim){nget=0;nbn++;}
    		nget+=dat[i];
    	}
    //	cout<<lim<<" "<<nbn<<endl;
    	return nbn<=bn;
    }
    int solve(){
    	int l=0,r=INT_MAX-1;
    	while(l<r){
    //		cout<<l<<" "<<r<<endl;
    		int mid=(l+r)>>1;
    		if(is_ok(mid))r=mid;
    		else l=mid+1;
    	}
    	return l;
    }
    int main(){
    //	freopen("moiezen.in" ,"r",stdin);
    //	freopen("moiezen.out","w",stdout);
    	scanf("%d%d%d",&pn,&mod,&bn);
    	for(int i=1;i<=pn;i++)
    		scanf("%d",wi+i);
    	for(int x=0;x<mod;x++){
    		for(int i=1;i<=pn;i++)
    			dat[i]=(wi[i]+x)%mod;//cout<<dat[i]<<" ";
    		if(!is_ok(ans))continue;
    //		cout<<endl;
    		ans=min(ans,solve());
    	}
    	printf("%d
    ",ans);
    }
    

     #2 CSDP-S模拟

    我$DP$好菜啊……

    T1

    $Dp$

    #include <iostream>
    #include <cstring>
    #include <cstdio>
    #include <cmath>
    #define N 2222
    #define L 111111
    #define LL long long
    
    using namespace std;
    
    const int Mod=1e9+7;
    LL dp[N][N];
    int tol,nol;
    LL ans=0;
    char st[L];
    int main(){
    	int ln=0,rn=0;
    	scanf("%d%d%s",&tol,&nol,st);
    	dp[0][0]=1;
    	for(int i=1;i<=tol-nol;i++){
    		dp[i][0]=dp[i-1][1];
    		for(int j=1;j<=i;j++)
    			dp[i][j]=(dp[i-1][j-1]+dp[i-1][j+1])%Mod;
    	}
    	for(int i=0;i<nol;i++){
    		if(st[i]=='(') rn++;
    		else           rn--;
    		ln=min(ln,rn);
    	}
    	ln=-ln;
    	for(int i=ln;i<=tol-nol;i++) {
    		for(int j=ln;j+rn<=tol-nol;j++) {
    			ans=(ans+(dp[i][j]*dp[tol-nol-i][j+rn]%Mod))%Mod;
    		}
    	}
    	printf("%lld
    ",ans);
    }
    

    T2

    Dp

    T3

    性质图论题

    很好奇为啥有时候就有一个圈在这里转,我也没添加啊$QAQ Longrightarrow$

  • 相关阅读:
    Shortest Paths
    Minimum Spanning Trees
    Programming Assignment 1: WordNet
    Directed Graphs
    内连接
    数据中台文档--参考
    ORACLE触发器字段触发
    DTS
    oracle删除归档日志
    OGG 分区表
  • 原文地址:https://www.cnblogs.com/kalginamiemeng/p/Exam20191013.html
Copyright © 2020-2023  润新知