2013 成都网络赛 1003 1004 1007 1008 1010

 

思路:

1003是大水题

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 100010
#define Maxm 200010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
char ss[20]="nanodesu";
int main()
{
    int t,i,j,l;
    int Case=0;
    char str[110];
    scanf("%d",&t);
    while(t--){
        scanf("%s",&str);
        l=strlen(str);
        printf("Case #%d: ",++Case);
        if(l>=4&&str[l-1]=='u'&&str[l-2]=='s'&&str[l-3]=='e'&&str[l-4]=='d'){
            str[l-4]='\0';
            printf("%s",str);
            printf("%s\n",ss);
            continue;
        }
        printf("%s",str);
        printf("%s\n",ss);
    }
    return 0;
}
View Code

1004贪心

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 100010
#define Maxm 200010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int main()
{
    int i,n,m,t,Case=1;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d",&m,&n);
        printf("Case #%d: ",Case++);
        if(m==1)
        {
            for(i=0;i<n;i++)
                printf("a");
            printf("\n");
        }
        else if(m>=3)
        {
            int l=n/3;
            for(i=0;i<l;i++)
                printf("abc");
            if(n%3==1)
                printf("a");
            else if(n%3==2)
                printf("ab");
            printf("\n");
        }
        else if(n==1)
         printf("a\n");
        else if(n==2)
         printf("ab\n");
        else if(n==3)
         printf("aab\n");
        else if(n==4)
         printf("aabb\n");
        else if(n==5)
         printf("aaaba\n");
        else if(n==6)
         printf("aaabab\n");
        else if(n==7)
         printf("aaababb\n");
        else if(n==8)
         printf("aaababbb\n");
        else
        {
            int r=(n-2)%6;
            int w=(n-2)/6;
            printf("aa");
            for(i=0;i<w;i++)
                printf("aababb");
            if(r<=4)
            {
                for(i=0;i<r;i++)
                    printf("a");
            }
            if(r==5)
                printf("aaaab");
            printf("\n");
        }
    }
    return 0;
}
View Code

1007 动态规划

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
char x[11],y[11];
int map[5000][11];
int c1,c2;
int w[]={1,2,4,8,16,32,64,128,256,512};
int jisuan(int a,int b)
{
    if(b<0) return 0;
    if(a==0) return 1;
    if(map[b][a]>=0) return map[b][a];
    if(a==1)
    {map[b][a]=(10<=b?10:b+1);return map[b][a];}

    int j,num=0;
    for(j=0;j<=9;j++)
        num+=jisuan(a-1,b-j*w[a-1]);
    map[b][a]=num;
    return num;
}
int main()
{
    int i,j,n;
    scanf("%d",&n);
    memset(map,-1,sizeof(map));
    for(j=1;j<=n;j++)
    {
        scanf("%s%s",&x,&y);
        c1=strlen(x);c2=strlen(y);
        int zs=0;
        for(i=0;i<c1;i++)
            zs+=(x[i]-'0')*w[c1-i-1];
        int t=0,num=0;
        while(t<c2)
        {
            if(t==c2-1)
            {
                if(zs>=0)
                num+=(zs-(y[t]-'0')>=0 ? y[t]-'0'+1 : zs+1);
                break;
            }
            for(i=0;i<=y[t]-'0';i++)
            {
                if(i==(y[t]-'0'))
                {
                    zs-=i*w[c2-t-1];
                    break;
                }
                num+=jisuan(c2-t-1,zs-i*w[c2-t-1]);
            }
            t++;
        }
        printf("Case #%d: %d\n",j,num);
    }
    return 0;
}
View Code

1008 DLX 加个剪枝就行

#include<set>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 60
#define Maxm 80002
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 1000000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int D[Maxn*Maxn],U[Maxn*Maxn],L[Maxn*Maxn],R[Maxn*Maxn],S[Maxn*Maxn],C[Maxn*Maxn],H[Maxn],X[Maxn*Maxn],Q[Maxn*Maxn],id,d,n,K,cnt,f,ans;
int dis[60][60],ty[60];
bool vi[Maxn];
void init(int m)
{
    int i;
    for(i=0;i<=m;i++){
        D[i]=U[i]=i;
        L[i+1]=i;
        R[i]=i+1;
        S[i]=0;
    }
    R[m]=0;
    id=m+1;
}
void ins(int r, int c)
{
    U[id] = c;
    D[id] = D[c];
    U[D[c]] = id;
    D[c] = id;
    if (H[r] < 0)
        H[r] = L[id] = R[id] = id;
    else
    {
        L[id] = H[r];
        R[id] = R[H[r]];
        L[R[H[r]]] = id;
        R[H[r]] = id;
    }
    S[c]++;
    X[id]=r;
    C[id++] = c;
}
void Remove(int c)
{
    int i;
    for(i=D[c];i!=c;i=D[i]){
        L[R[i]]=L[i];
        R[L[i]]=R[i];
    }
}
void Resume(int c)
{
    int i;
    for(i=D[c];i!=c;i=D[i]){
        L[R[i]]=i;
        R[L[i]]=i;
    }
}
int A()
{
    int i,j,k,ret=0;
    memset(vi,false,sizeof(vi));
    for(i=R[0];i;i=R[i]) if(!vi[i]){
        ret++;
        for(j=D[i];j!=i;j=D[j]){
            for(k=R[j];k!=j;k=R[k])
                vi[C[k]]=true;
        }
    }
    return ret;
}
void dfs(int step)
{
    if(step+A()>K) return ;
    int nn=0;
    int i,j,temp,c;
    for(i=0;i<step;i++){
        nn+=ty[X[Q[i]]];
    }
    if(step-nn>=ans){
        return ;
    }
    if(R[0]==0) {
        f=1;
        nn=0;
        for(i=0;i<step;i++){
            nn+=ty[X[Q[i]]];
        }
        ans=min(ans,step-nn);
        return ;
    }
    temp=inf;
    for(i=R[0];i;i=R[i]) if(S[i]<temp){
        temp=S[i];
        c=i;
    }
    for(i=D[c];i!=c;i=D[i]){
        Q[step]=i;
        Remove(i);
        for(j=R[i];j!=i;j=R[j]){
            Remove(j);
        }
        dfs(step+1);
        for(j=R[i];j!=i;j=R[j])
            Resume(j);
        Resume(i);
    }
    return ;
}
void floyd()
{
    int i,j,k;
    for(k=1;k<=n;k++){
        for(i=1;i<=n;i++){
            for(j=1;j<=n;j++){
                dis[i][j]=min(dis[i][j],dis[i][k]+dis[k][j]);
            }
        }
    }
}
void build()
{
    int i,j,k;
    init(n);
    for(i=1;i<=n;i++){
        H[i]=-1;
        for(j=1;j<=n;j++){
            if(dis[i][j]<=d){
                ins(i,j);
            }
        }
    }
}
int main()
{
    int t,i,j,u,v,val,Case=0;
    scanf("%d",&t);
    while(t--){
        clr(dis,63);
        K=0;
        scanf("%d%d",&n,&d);
        for(i=1;i<=n;i++){
            scanf("%d",ty+i);
            K+=ty[i];
            dis[i][i]=0;
        }
        for(i=1;i<n;i++){
            scanf("%d%d%d",&u,&v,&val);
            dis[u][v]=dis[v][u]=val;
        }
        floyd();
        build();
        f=0;
        ans=inf;
        dfs(0);
        printf("Case #%d: ",++Case);
        if(!f){
            printf("-1\n");
            continue;
        }
        printf("%d\n",ans);
    }
    return 0;
}
View Code

1010 单调队列

#include<set>
#include<map>
#include<cmath>
#include<queue>
#include<cstdio>
#include<vector>
#include<string>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
#define pb push_back
#define mp make_pair
#define Maxn 200010
#define Maxm 200010
#define LL __int64
#define Abs(x) ((x)>0?(x):(-x))
#define lson(x) (x<<1)
#define rson(x) (x<<1|1)
#define inf 100000
#define lowbit(x) (x&(-x))
#define clr(x,y) memset(x,y,sizeof(x))
#define Mod 1000000007
using namespace std;
int cnt[40],num[Maxn];
int que[Maxn];
int getnum(int val,int c)
{
    int temp=val,cc=0;
    int sum=0;
    while(val){
        if(val%2) cnt[cc]+=c;
        val>>=1;
        cc++;
    }
    for(int i=0;i<=30;i++)
    if(cnt[i]){
        sum+=(1<<i);
    }
    return sum;
}
int main()
{
    int t,n,m,i,j,Case=0;
    scanf("%d",&t);
    while(t--){
        scanf("%d%d",&n,&m);
        for(i=1;i<=n;i++){
            scanf("%d",num+i);
        }
        clr(cnt,0);
        int head=0,rear=0;
        int temp;
        LL ans=0;
        for(i=1;i<=n;i++){
            temp=getnum(num[i],1);
            que[rear++]=i;
            while(rear>=head&&temp>=m){
                temp=getnum(num[que[head]],-1);
                head++;
            }
            ans+=(LL)rear-head;
        }
        printf("Case #%d: %I64d\n",++Case,ans);
    }
    return 0;
}
View Code

 

 

posted @ 2013-09-14 19:19 fangguo 阅读(...) 评论(...) 编辑 收藏