zoukankan      html  css  js  c++  java
  • 2019.8.17 小结

    T1 塔 70/40

    题意:给n个积木,搭成两个高度相同的塔,问最高高度

    考场思路没想到dp,直接爆搜

    正解是dp

    答案在dp[n][0]

    代码

    #include<bits/stdc++.h>
    using namespace std;
    int f[2][1000050],n,a[51],ans;
    int main(){ 
    	memset(f,-0x3f,sizeof(f));
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		scanf("%d",&a[i]);
    	}
    	f[0][500000]=0;
    	for(int i=1;i<=n;++i){
    		for(int j=0;j<=1000000;++j){
    			 f[i%2][j]=max(f[i%2][j],f[(i%2)^1][j]);
    			 if(j-a[i]>=0)f[i%2][j]=max(f[i%2][j],f[(i%2)^1][j-a[i]]+a[i]);
    			 if(j+a[i]<=1000000)f[i%2][j]=max(f[i%2][j],f[(i%2)^1][j+a[i]]);
                 if(j==500000)ans=max(ans,f[i%2][j]);
    		}
    	}
    	printf("%d",ans==0?-1:ans);
    	return 0;
    }
    

    T2 前缀单词 100/100

    题意:给n个单词,如果单词a为单词b的前缀则a,b不能共存,问能共存的集合数(包括空集)

    一道dp题,排序后判断,f[i][j]表示i和j是否能共存,f[i][j]=1表示能共存,初始化dp[i]=1,表示只有i一个单词,dp[i]表示前i个单词且一定含有第i个单词的集合数,如果f[i][j]=1,则dp[j]+=dp[i] (size(j)>=size(i))

    代码

    #include<bits/stdc++.h>
    using namespace std;
    string a[60];
    long long dp[60],ans;
    bool f[60][60];
    int n;
    bool clu(int i,int j){
        if(a[i].size()>a[j].size()) swap(i,j);
        return a[j].find(a[i])!=0;
    }
    int main(){
    	freopen("prefix.in","r",stdin);
    	freopen("prefix.out","w",stdout);
    	scanf("%d",&n);
    	for(int i=1;i<=n;++i){
    		cin>>a[i];
    	}
    	sort(a+1,a+1+n);
    	for(int i=1;i<=n;++i){
    		dp[i]=1;
    		for(int j=1;j<=n;++j) f[i][j]=clu(i,j);
    	}
    	for(int i=1;i<=n;++i){
    		for(int j=i;j<=n;++j){
    			if(f[i][j]) dp[j]+=dp[i];
    		}
    	}
    	for(int i=1;i<=n;++i){
    		ans+=dp[i];
    	}
    	printf("%lld",ans+1);
    	return 0;
    }
    

    T3 九数码 70/0

    题意:给出初始状态,要求到达

    1 2 3

    4 5 6

    7 8 9

    规则:选择4个数,顺时针旋转,有4种情况

    考场搜索,记忆下搜过的,还是超时了,正解是从最终状态展开广搜,记录到达每一个状态的步骤数,然后打表输出。

    代码

    T4 沙漠寻宝 70/0

    一道大模拟

    代码

    #include <cstdio>
    #include <iostream>
    #include <cstring>
    #include <string>
    using namespace std;
     
    string st[1010];
    int value[26];
    int f,o,s,i;
    int p[1010],num[1010];
    int s1[150];
    char s2[150];
    int t1=0,t2=0;
    char c;
     
    bool check(char ch){
        if((ch>='a'&&ch<='z')||(ch>='0'&&ch<='9')||(ch=='+')||(ch=='-')||(ch=='*')
            ||(ch=='/')||(ch=='(')||(ch==')')||(ch=='=')) 
            return true;
        return false;
    }
     
    void calcu(){
        int x1,x2,x;
        char p;
        p=s2[t2--];
        x2=s1[t1--];
        x1=s1[t1--];
        switch(p){
            case '+' : x=x1+x2; break;
            case '-' : x=x1-x2; break;
            case '*' : x=x1*x2; break;
            case '/' : x=x1/x2; break;
        }
        s1[++t1]=x;
    }
     
    void readStr(){
        char b;
        s++;
        int count=0;
        scanf("%c",&b);
        while(!check(b)) scanf("%c",&b);
        while(check(b)){
            st[s]=st[s]+b;
            if(b=='d')count++;
            if(count>20){
            	st[s]=st[s].substr(0,3);
            	break;
            }
            scanf("%c",&b);
        }
    }
     
    int result(string t){
        char c;
        unsigned i=0;
        t1=0,t2=0;
        int v;
        while(i<t.size()){
            c=t[i];
            if(c=='+'||c=='-'){
                while(t2&&s2[t2]!='(') calcu();
                s2[++t2]=c;
                i++;
            }
            else if(c=='*'||c=='/'){
                while(t2&&(s2[t2]=='*' || s2[t2]=='/')) calcu();
                s2[++t2]=c;
                i++;
            }
            else if(c=='('){
                s2[++t2]=c;
                i++;
            }
            else if(c==')'){
                while(s2[t2]!='(') calcu();
                t2--;
                i++;
            }
            else if(c>='a'&&c<='z'){
                s1[++t1]=value[c-'a'];
                i++;
            }else{
                v=0;
                do{
                    v=10*v+c-'0';
                    c=t[++i];
                }while(c>='0'&&c<='9'&&i<t.size());
                s1[++t1]=v;
            }
        }
        while(t2) calcu();
        return s1[t1];
    }
     
    int main(){
        //freopen("ttt.in","r",stdin);
        o=1;
        while(o!=0){
            readStr();
            //cout<<st[s]<<endl;
            if(st[s]=="loop") o++;
            else if(st[s]=="end") o--;
        }
        i=2;
        f=1;num[1]=1;
        while(i<=s){
            if(st[i]=="loop"){
                f++;
                i++;
                num[f]=result(st[i]);
                i++; p[f]=i;
            }
            else if(st[i]=="end"){
                num[f]--;
                if(num[f]==0){
                    f--;i++;
                }else i=p[f];
            }
            else if(st[i]=="break"){
                o=1;
                while(o!=0){
                    i++;
                    if(st[i]=="loop") o++;
                    else if(st[i]=="end") o--;
                }
                num[f]=1;
            }else if(st[i]=="continue"){
                o=1;
                while(o!=0){
                    i++;
                    if(st[i]=="loop") o++;
                    else if(st[i]=="end") o--;
                }
            }
            else if(st[i]=="write"){
                i++;
                printf("%d
    ",result(st[i]));
                i++;
            }
            else{
                value[st[i][0]-'a']=result(st[i].substr(2,st[i].size()-2));
                i++;
            }
        }
        return 0;
    }
    
    
  • 相关阅读:
    UVa 839 -- Not so Mobile(树的递归输入)
    UVa 548 -- Tree
    UVA 122 -- Trees on the level (二叉树 BFS)
    UVa679 小球下落(树)
    POJ 2255 -- Tree Recovery
    POJ 1451 -- T9
    POJ 2513 -- Colored Sticks
    STL -- heap结构及算法
    nginx利用try_files实现多个源
    nginx location的优先级
  • 原文地址:https://www.cnblogs.com/donkey2603089141/p/11414983.html
Copyright © 2011-2022 走看看