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\n",result(st[i]));
            i++;
        }
        else{
            value[st[i][0]-'a']=result(st[i].substr(2,st[i].size()-2));
            i++;
        }
    }
    return 0;
}

posted @ 2019-08-26 21:06  End_donkey  阅读(136)  评论(0编辑  收藏  举报