20130728组队(ACM-ICPC Dhaka Site Regional Contests, 2010 - Dhaka)

A. Emoogle Balance:

这道题目看起来比较长,但是主要的就是那个公式:Emoogle Balance = number of times Emoogle is supposed to give a treat 
 according to the book - number of times he has actually given the treat. 这样的话,我们就只是求和再相减就可以了,因为非0代表前一项,0代表后一项:
#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;

int main()
{
    int n;
    int cnt = 0;
    while(scanf("%d", &n))
    {
        if(!n)
            break;
        cnt++;
        int a;
        int num0 = 0;
        int num = 0;
        for(int i = 0; i < n; ++i)
        {
            scanf("%d", &a);
            if(a)
                num++;
            else num0++;
        }
        printf("Case %d: %d\n",cnt, num-num0 );
    }
    return 0;
}

B. A Digital Satire of Digital Age


这道题目是个大模拟啊,昨天一直没读懂,今天搞懂了,发现不是难题,就是麻烦。写了快两个小时终于把这道题干掉了。囧啊(/ □ \)。代码:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;
char sp[8][18];
int weight(int n)
{
    int sum0 = 0;
    int sum1 = 0;
    while(n > 0)
    {
        int tp = n%2;
        if(tp)
            sum1++;
        else
            sum0++;
        n = n/2;
    }
    return sum1*500+250*sum0;
}
void tiaozhen2()
{
    for(int i = 0; i <= 4; ++i)
    {
        for(int j = 0; j <= 7; ++j)
        {
            sp[i][j] = sp[i+2][j];
        }
    }
    for(int i = 0; i <=7; ++i)
    {
        sp[5][i] = '.';
        sp[6][i] = '.';
    }
    for(int i =6; i >=2 ; --i)
    {
        for(int j = 10; j < 18; ++j)
        {
            sp[i][j] = sp[i-2][j];
        }
    }
    for(int i = 10; i < 18; ++i)
    {
        sp[0][i] = '.';
        sp[1][i] = '.';
    }
}
void tiaozhen1()
{
    for(int i = 1; i <= 5; ++i)
    {
        for(int j = 0; j <= 7; ++j)
        {
            sp[i][j] = sp[i+1][j];
        }
    }
    for(int i = 0; i <= 7; ++i)
    {
        sp[6][i] = '.';
    }
    for(int i = 5; i >= 1; --i)
    {
        for(int j = 10; j < 18; ++j)
        {
            sp[i][j] = sp[i-1][j];
        }
    }
    for(int i = 10; i < 18; ++i)
    {
        sp[0][i] = '.';
    }
}
void tiaozhen4()
{
    for(int i = 0; i <= 4; ++i)
    {
        for(int j = 0; j <= 7; ++j)
        {
            sp[i][j] = sp[i+1][j];
        }
    }
    for(int i = 0; i <= 7; ++i)
    {
        sp[5][i] = '.';
    }
    for(int i = 6; i >=2; --i)
    {
        for(int j = 10; j < 18; ++j)
        {
            sp[i][j] = sp[i-1][j];
        }
    }
    for(int i = 10; i < 18; ++i)
    {
        sp[1][i] = '.';
    }
}
void tiaozhen3()
{
    for(int i = 6; i >=2; --i)
    {
        for(int j = 0; j <= 7; ++j)
        {
            sp[i][j] = sp[i-1][j];
        }
    }
    for(int i = 0; i <= 7; ++i)
    {
        sp[1][i] = '.';
    }
    for(int i = 0; i <= 4; ++i)
    {
        for(int j = 10; j < 18; ++j)
        {
            sp[i][j] = sp[i+1][j];
        }
    }
    for(int i = 10; i < 18; ++i)
    {
        sp[5][i] = '.';
    }
}
void tiaozhen5()
{
    for(int i = 5; i >= 1; --i)
    {
        for(int j = 0; j <= 7; ++j)
        {
            sp[i][j] = sp[i-1][j];
        }
    }
    for(int i = 0; i <= 7; ++i)
    {
        sp[0][i] = '.';
    }
    for(int i = 1; i <= 5; ++i)
    {
        for(int j = 10; j < 18; ++j)
        {
            sp[i][j] = sp[i+1][j];
        }
    }
    for(int i = 10; i < 18; ++i)
    {
        sp[6][i] = '.';
    }
}
void tiaozhen6()
{
    for(int i = 6; i >=2; --i)
    {
        for(int j = 0; j <= 7; ++j)
        {
            sp[i][j] = sp[i-2][j];
        }
    }
    for(int i = 0; i <= 7; ++i)
    {
        sp[0][i] = '.';
        sp[1][i] = '.';
    }
    for(int i = 0; i <= 4; ++i)
    {
        for(int j = 10; j < 18; ++j)
        {
            sp[i][j] = sp[i+2][j];
        }
    }
    for(int i = 10; i < 18; ++i)
    {
        sp[6][i] = '.';
        sp[5][i] = '.';
    }
}
int main()
{
    int t;
    scanf("%d", &t);
    int cnt = 0;
    while(t--)
    {
        memset(sp, 0, sizeof(sp));
        cnt++;
        int flag = 0;
        for(int i = 0; i < 8; ++i)
        {
            for(int j = 0; j < 18; ++j)
                cin >> sp[i][j];
        }
        printf("Case %d:\n", cnt);
        int sumz = 0;
        int sumy = 0;
        for(int i = 0; i < 7; ++i)
        {
            for(int j = 0; j <= 7; ++j)
            {
                if(sp[i][j]>='A'&&sp[i][j]<='Z')
                {
                    sumz = sumz + weight(sp[i][j]);
                   // cout << sp[i][j]<<endl;
                }

            }
        }
        //cout << "*************"<<endl;
        for(int i = 0; i < 7; ++i)
        {
            for(int j = 10; j < 18; ++j)
            {
                if(sp[i][j]>='A'&&sp[i][j]<='Z')
                {
                    sumy = sumy + weight(sp[i][j]);
                    //cout << sp[i][j]<<endl;
                }

            }
        }
        //cout << sumz << ' ' << sumy << endl;
        int tz, ty;
        for(int i = 0; i < 7; ++i)
        {
            for(int j = 0; j <= 7; ++j)
            {
                if(sp[i][j]=='/')
                {
                    tz = i;
                    break;
                }
            }
        }
        for(int i = 0; i < 7; ++i)
        {
            for(int j = 10; j < 18; ++j)
            {
                if(sp[i][j]=='/')
                {
                    ty = i;
                    break;
                }
            }
        }
        if(tz > ty)
        {
            if(sumz > sumy)
            {
                printf("The figure is correct.\n");
                flag = 1;
            }
            else
            {
                if(sumz == sumy)
                {
                    tiaozhen1();
                }
                else
                {
                    tiaozhen2();
                }
            }
        }
        else if(tz == ty)
        {
            if(sumz == sumy)
            {
                printf("The figure is correct.\n");
                flag = 1;
            }
            else if(sumz > sumy)
            {
                tiaozhen3();
            }
            else
            {
                tiaozhen4();
            }
        }
        else
        {
            if(sumz < sumy)
            {
                printf("The figure is correct.\n");
                flag = 1;
            }
            else if(sumz == sumy)
            {
                tiaozhen5();
            }
            else
            {
                tiaozhen6();
            }
        }
        if(flag == 0)
        {
            for(int i = 0; i < 7; ++i)
            {
                for(int j = 0; j < 18; ++j)
                    cout << sp[i][j];
                printf("\n");
            }
        }
    }
    return 0;
}


C. Hyper Box


这道题目一开始一直没有看懂题目,后来才看懂说是对于一个N维的石碑,我们用斐波那契数列长度的砖来砌,这样的话,因为下面给的是每条边的长度。这样有要求最小的数目,那么我们就可以尽量采用尺寸大的砖去填补。这样就OK了。每次输入一条边的长度之后,直接上尽量大的斐波那契数。知道被填满,后面的就直接乘以用掉的个数(这是运用立方体的性质)。这样就出来了:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;
long long sp[51];
void init()
{
    sp[0] = 1;
    sp[1] = 2;
    for(int i = 2; i <= 50; ++i)
        sp[i] = sp[i-2]+sp[i-1];
}
int main()
{
    int t, n;
    long long len;
    init();
    scanf("%d", &t);
    for(int i = 1; i <= t; ++i)
    {
        scanf("%d", &n);
        long long tot = 1;
        for(int j = 0; j < n; ++j)
        {
            scanf("%lld", &len);
            long long sum = 0;
            for(int k = 50; k >= 0; k--)
            {
                while(len >= sp[k])
                {
                    sum++;
                    len -= sp[k];
                }
            }
            tot *= sum;
        }
        printf("Case %d: %lld\n", i,tot);
    }
    return 0;
}

E. Halloween Costumes

这道题目DP转移,(/ □ \)。表示推不出转移方程。看到一发爆搞的,囧:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;

using namespace std;
int dp[105][105];
int a[105];

int main()
{
    int t;
    int counter=0;
    int n,m,i,j,k;
    scanf("%d",&t);
    while(t--)
    {
        counter++;
        scanf("%d%d",&n,&m);
        for(i=0; i<n; i++)
            scanf("%d",&a[i]);
        for(i=0; i<n; i++)
            dp[i][i]=1;
        for(i=1; i<n; i++)
        {
            for(j=0; j+i<n; j++)
            {
                dp[j][j+i]=dp[j+1][j+i]+1;
                for(k=j+1; k<=j+i; k++)
                    if(a[j]==a[k])
                    {
                        if(dp[j][j+i]>dp[j][k-1]+dp[k][j+i]-1)
                            dp[j][j+i]=dp[j][k-1]+dp[k][j+i]-1;
                    }
            }
        }
        printf("Case %d: %d\n",counter,dp[0][n-1]);
    }
    return 0;
}


H. Optimal Store


这道题目属于一道几何题目,本来想着是不是有什么特殊的点,可是找了好久都没有找到。刚开始想枚举的时候,不知道如何实现枚举小数了。搞了好久。今天听大神讲了一下,枚举三角形内部的点。不断得到最小值直到达到精度为止。这样就OK了,还是太弱了。(/ □ \)。每次移动的时侯需要检查一下,这一步移动有作用吗?有的话就继续,否则回到上一步,执行另外一步移动:

#include <iostream>
#include <cstdio>
#include <string>
#include <string.h>
#include <map>
#include <vector>
#include <cstdlib>
#include <algorithm>
#include <cmath>
#include <queue>
#include <set>
#include <stack>
using namespace std;

#define N 34445532.0
#define ee 1e-9
double x1,x2,x3,z,y2,y3;
double d(double a1,double b1,double a2,double b2)
{
    return sqrt((a1-a2)*(a1-a2)+(b1-b2)*(b1-b2));
}
double g(int i,double a,double b)
{
    double l1,l2,l3;
    l1=d(a,b,x1,z);
    l2=d(a,b,x2,y2);
    l3=d(a,b,x3,y3);
    if(i==0)
        return (l1+l2+l3)*2.0-l1;
    else if(i==1)
        return (l1+l2+l3)*2.0-l2;
    else
        return (l1+l2+l3)*2.0-l3;
}
int main()
{
    int cas=0,i,f;
    double ans,xm,ym,xn,yn;
    double len,xx,yy;
    double now,fur;
    double xd,yd,sum;
    while(cin>>x1>>z>>x2>>y2>>x3>>y3)
    {
        if(x1<0&&z<0&&x2<0&&y2<0&&x3<0&&y3)
        {
            break;
        }
        cas++;
        xm=max(x1,max(x2,x3));
        ym=max(z,max(y2,y3));
        xn=min(x1,min(x2,x3));
        yn=min(z,min(y2,y3));
        i=3;
        sum=N;
        while(i--)
        {
            xx=(x1+x2+x3)/3.0;
            yy=(z+y2+y3)/3.0;
            len=max(xm-xn,ym-yn);
            now=g(i,xx,yy);
            while(len>ee)
            {
                f=1;
                while(f==1)
                {
                    f=0;
                    now=g(i,xx,yy);
                    xd=xx+len;
                    yd=yy;
                    fur=g(i,xd,yd);
                    if(fur<now)
                    {
                        now=fur;
                        xx=xd;
                        f=1;
                    }
                    if(f==0)
                    {
                        now=g(i,xx,yy);
                        xd=xx-len;
                        yd=yy;
                        fur=g(i,xd,yd);
                        if(fur<now)
                        {
                            now=fur;
                            xx=xd;
                            f=1;
                        }
                    }
                    if(f==0)
                    {
                        now=g(i,xx,yy);
                        xd=xx;
                        yd=yy+len;
                        fur=g(i,xd,yd);
                        if(fur<now)
                        {
                            now=fur;
                            yy=yd;
                            f=1;
                        }
                    }
                    if(f==0)
                    {
                        now=g(i,xx,yy);
                        xd=xx;
                        yd=yy-len;
                        fur=g(i,xd,yd);
                        if(fur<now)
                        {
                            now=fur;
                            yy=yd;
                            f=1;
                        }
                    }
                }
                len=len*0.33;
            }
            sum=min(sum,now);
        }
        printf("Case %d: %.8f\n",cas,sum);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值