标题: 几道编程题
性别:未知-离线 trichromatic

Rank: 4
组别 校尉
级别 破贼校尉
好贴 2
功绩 11
帖子 58
编号 364075
注册 2010-3-6


发表于 2010-12-26 21:24 资料 文集 短消息 看全部作者
[算了 考虑了一下 还是不贴了 以免打扰大家思维的乐趣。]

贴几个我自己的代码。

07 创建目录

#include<stdio.h>
#include<map>
#include<string>
using namespace std;
class folder
{
public:
        map<string,folder*> Map;
        folder(){}
} *root,*p,*q;
int main()
{
        int _,t,n,m;
        char s[110000];
        scanf("%d",&_);
        for(t=1; t<=_; t++)
        {
                scanf("%d%d",&n,&m);
                int ans=0;
                root=new folder();
                for(int i=0; i<n+m; i++)
                {
                        scanf("%s",s);
                        p=root;
                        for(int j=0;;)
                        {
                                string w="";
                                for(j++; s[j]!=0 && s[j]!='/'; j++)
                                        w+=s[j];
                                if(p->Map.find(w)==p->Map.end())
                                {
                                        p->Map[w]=new folder();
                                        if(i>=n)
                                                ans++;
                                }
                                p=p->Map[w];
                                if(s[j]==0)break;
                        }
                }
                printf("Case #%d: %d\n",t,ans);
        }
        return 0;
}

09 绝对序号

#include<stdio.h>
#define mod 100003
long long int dp[510][510],ans[510];
long long int c[510][510];
void init()
{
        for(int i=0; i<=500; i++)
                for(int j=0; j<=i; j++)
                        if(j==0 || j==i)
                                c[j]=1;
                        else
                                c[j]=(c[i-1][j]+c[i-1][j-1])%mod;
        for(int i=2; i<=500; i++)
        {
                dp[1]=ans=1;
                for(int j=2; j<i; j++)//the rank of i in that set
                {
                        for(int k=1; k<j; k++)//the rank of j in that set
                                dp[j]+=dp[j][k]*c[i-j-1][j-k-1]%mod;
                        dp[j]%=mod;
                        ans+=dp[j];
                }
                ans%=mod;
        }
}
int main()
{
        int _,t,n;
        init();
        scanf("%d",&_);
        for(t=1; t<=_; t++)
        {
                scanf("%d",&n);
                printf("Case #%d: %I64d\n",t,ans[n]);
        }
        return 0;
}

18 修建栅栏

#include<stdio.h>
#include<queue>
#include<utility>
#include<algorithm>
using namespace std;
int n;
long long int a[100],l,g;
long long int gcd(long long int x,long long int y){return y?gcd(y,x%y):x;}
int dp[100010];
priority_queue<pair<int,long long int> > q;
int main()
{
int t,_;
scanf("%d",&_);
for(t=1; t<=_; t++)
{
  scanf("%I64d%d",&l,&n);
  g=0;
  for(int i=0; i<n; i++)
  {
   scanf("%I64d",&a);
   g=gcd(g,a);
  }
  sort(a,a+n);
  printf("Case #%d: ",t);
  if(l%g)
  {
   puts("IMPOSSIBLE");
   continue;
  }
  memset(dp,-1,sizeof(dp));
  dp[0]=0;
  q.push(make_pair(0,0));
  n--;
  int u=a[n];
  while(!q.empty())
  {
   int c=q.top().first;
   long long int l1=-q.top().second;
   q.pop();
   if(dp[c]!=l1)continue;
   for(int i=0; i<n; i++)
   {
    long long int l2=c+a,cost=dp[c]+1;
    if(l2>=u)l2-=u,cost--;
    if(dp[l2]==-1 || dp[l2]>cost)
    {
     dp[l2]=cost;
     q.push(make_pair((int)(l2),-dp[l2]));
    }
   }
  }
  long long int w=l%a[n];
  long long int ans=dp[w]+(l-w)/a[n];
  printf("%I64d\n",ans);
  fprintf(stderr,"%d\n",t);
}
return 0;
}

[ 本帖最后由 trichromatic 于 2010-12-26 22:00 编辑 ]


顶部

正在浏览此帖的会员 - 共 1 人在线




当前时区 GMT+8, 现在时间是 2025-1-18 01:47
京ICP备2023018092号 轩辕春秋 2003-2023 www.xycq.org.cn

Powered by Discuz! 5.0.0 2001-2006 Comsenz Inc.
Processed in 0.013351 second(s), 9 queries , Gzip enabled

清除 Cookies - 联系我们 - 轩辕春秋 - Archiver - WAP