第37届ACM/ICPC 金华赛区现场赛最水四道题 HDU 4442 Physical Examination HDU 4450 Draw Something HDU 4451 Dressing HDU 4452 Running Rabbits

 

HDU 4442 Physical Examination

2012年金华赛区现场赛A题。

水题,排序后解决。

对于两个 a1,b1 和a2,b2;

先1后2:a1+a2+a1*b2

先2后1: a1+a2+b1*a2;

1排在2前面的条件就是: a1*b2<b1*a2.

所以按照这个条件排序,然后出结果就可以了。

 

代码实现主要是要处理,会超出int的,最好用long long,或者乘之前强制转换下。

代码:

HDU 4442
#include<stdio.h>

#include<iostream>

#include<algorithm>

#include<string.h>

using namespace std;

const int MAXN=100010;

const int MOD=365*24*60*60;

struct Node

{

    int a,b;

}node[MAXN];



bool cmp(Node a,Node b)

{

    return (long long)a.a*b.b<(long long)b.a*a.b;

}

int main()

{

    int n;

    while(scanf("%d",&n)==1 && n)

    {

        for(int i=0;i<n;i++)

          scanf("%d%d",&node[i].a,&node[i].b);

        sort(node,node+n,cmp);

        long long ans=0;

        long long t=0;

        for(int i=0;i<n;i++)

        {

            ans+=(node[i].a+t*node[i].b)%MOD;

            ans%=MOD;

            t+=(node[i].a+t*node[i].b)%MOD;

            t%=MOD;

        }

        printf("%I64d\n",ans);

    }

    return 0;

}

 

 

HDU 4450  Draw Something

2012年金华赛区I题

这题就不解释了,签到题。求n个数的平方和

区域赛出的这么水,有意思么。。。基本上全部1A了。

HDU 4450
#include<stdio.h>

#include<algorithm>

#include<iostream>

#include<string.h>

using namespace std;

int main()

{

    int n;

    int a;

    while(scanf("%d",&n)==1&&n)

    {

        int ans=0;

        while(n--)

        {

            scanf("%d",&a);

            ans+=a*a;

        }

        printf("%d\n",ans);

    }

    return 0;

}

 

 

HDU 4451 Dressing

2012年金华赛区J题

水题一枚。

就是有N件衣服,M件裤子,K件鞋子。

有一些衣服和裤子是搭配不和谐的,有一些裤子和鞋子是搭配不和谐的。

问有多少种搭配衣服+裤子+鞋子,使得不存在不和谐的。

 

很简单,不要想得太多。

 

最直接的方法是枚举每一件组合,找出符合的,复杂度O(N*M*K),这个肯定是超时的。。。

可以降低一维。

枚举每一件衣服和裤子的组合,如果衣服和裤子可以搭配,则看该条裤子可以和多少件鞋子搭配。累加就可以了。

这个的复杂度是O(N*M).这个对于这题已经可以AC了,虽然效率没有很高。

还可以再降低一维。

枚举每条裤子,可以和这条裤子搭配的衣服数乘以可以和这条衣服搭配的鞋子数。累加起来就是答案。

复杂度O(M).

代码,按照第二种思路写的。

HDU 4451
#include<stdio.h>

#include<string.h>

#include<iostream>

#include<algorithm>

using namespace std;



const int MAXN=1010;

int a[MAXN][MAXN],b[MAXN][MAXN];

int c[MAXN];

int main()

{

    int N,M,K;

    int P;

    char str1[20],str2[20];

    int t1,t2;

    while(scanf("%d%d%d",&N,&M,&K)==3)

    {

        if(N==0&&M==0&&K==0)break;

        memset(a,0,sizeof(a));

        memset(b,0,sizeof(b));

        memset(c,0,sizeof(c));

        scanf("%d",&P);

        while(P--)

        {

            scanf("%s%d%s%d",&str1,&t1,&str2,&t2);

            if(strcmp(str1,"clothes")==0)

            {

                a[t1][t2]=1;

            }

            else

            {

                if(b[t1][t2]==0)

                {

                    b[t1][t2]=1;

                    c[t1]++;

                }

            }

        }

        int ans=0;

        for(int i=1;i<=N;i++)

          for(int j=1;j<=M;j++)

            if(a[i][j]==0)

              ans+=(K-c[j]);

        printf("%d\n",ans);

    }

    return 0;

}

 

HDU 4452   Running Rabbits

2012年金华赛区K题

简单模拟,一秒一秒模拟过去就可以了。

注意0秒时不要左转。还有,假如相撞了,交换方向,不左转了。

HDU 4452
#include<stdio.h>

#include<iostream>

#include<string.h>

#include<algorithm>

using namespace std;

int n;

int x1,y1;

int x2,y2;

int dir1,dir2;//0北,1西,2南,3东

int s1,t1;

int s2,t2;



void action(int t)

{

    if(x1==x2&&y1==y2)swap(dir1,dir2);

    else

    {

        if(t!=0 && t%t1==0){dir1+=1;dir1%=4;}

        if(t!=0 && t%t2==0){dir2+=1;dir2%=4;}

    }



    for(int i=0;i<s1;i++)

    {

        if(dir1==0&&x1==1)dir1+=2,dir1%=4;

        if(dir1==1&&y1==1)dir1+=2,dir1%=4;

        if(dir1==2&&x1==n)dir1+=2,dir1%=4;

        if(dir1==3&&y1==n)dir1+=2,dir1%=4;



        if(dir1==0)x1--;

        else if(dir1==1)y1--;

        else if(dir1==2)x1++;

        else y1++;

    }



    for(int i=0;i<s2;i++)

    {

        if(dir2==0&&x2==1)dir2+=2,dir2%=4;

        if(dir2==1&&y2==1)dir2+=2,dir2%=4;

        if(dir2==2&&x2==n)dir2+=2,dir2%=4;

        if(dir2==3&&y2==n)dir2+=2,dir2%=4;



        if(dir2==0)x2--;

        else if(dir2==1)y2--;

        else if(dir2==2)x2++;

        else y2++;

    }

    //printf("%d %d  %d  %d\n",x1,y1,x2,y2);

}



int main()

{

    char str1[10],str2[10];

    while(scanf("%d",&n)==1 && n)

    {

        scanf("%s%d%d",&str1,&s1,&t1);

        scanf("%s%d%d",&str2,&s2,&t2);

        x1=1,y1=1;

        x2=n,y2=n;

        if(str1[0]=='N')dir1=0;

        else if(str1[0]=='W') dir1=1;

        else if(str1[0]=='S') dir1=2;

        else dir1=3;



        if(str2[0]=='N')dir2=0;

        else if(str2[0]=='W') dir2=1;

        else if(str2[0]=='S') dir2=2;

        else dir2=3;



        int K;

        scanf("%d",&K);

        for(int i=0;i<K;i++)action(i);

        printf("%d %d\n%d %d\n",x1,y1,x2,y2);

    }

    return 0;

}

 

 

 

 

 

 

 

 

 

 

 

你可能感兴趣的:(Mina)