第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;
}

 

 

 

 

 

 

 

 

 

 

 

    原文作者:算法小白
    原文地址: https://www.cnblogs.com/kuangbin/archive/2012/10/29/2745368.html
    本文转自网络文章,转载此文章仅为分享知识,如有侵权,请联系博主进行删除。
点赞