CCNU 2010 contest1

Problem A

喵呜语言是一门很深奥的语言,但是,每门语言都是有规律的,当喵呜们发“喵呜”的时候,往往都是“喵”字重音,“呜”字轻音,而在喵呜语言的书写上,由于要突出重音和轻音(不然很有可能被理解为“呜喵”),重音用大写字母表示,轻音用小写字母表示,而且一个字母表示一个音,因此可以认为大写小写是交替出现的,例如:How are you!,翻译成喵呜语言后变成了:HoW aRe YoU!,其中第一个字母永远是重音,而空格和符号都要保留,现在给一句话,请将其翻译成喵呜语言。

输入:

输入一行,一句话(不超过100个字符,可能包含空格,英文标点符号和大小写英文字母)

输出:

一句话,转换成喵呜语言后的话

样例输入:

How are you

样例输出:

HoW aRe YoU!


字符串,判断各位是否为大小写字母,根据位数操作

#include <stdio.h>
#include <string.h>
int main()
{
    char s[101];
    //freopen("a.in","r",stdin);
    //freopen("b.out","w",stdout);
    while(gets(s))
    {
        int l=strlen(s);
        int tag=0;
        for(int i=0;i<l;i++)
        {
            tag++;
            if(tag%2==1)
            {
                if(s[i]<='z'&&s[i]>='a')
                    printf("%c",s[i]-'a'+'A');
                else
                    printf("%c",s[i]);
            }
            else
            {
                if(s[i]>='A'&&s[i]<='Z')
                    printf("%c",s[i]-'A'+'a');
                else
                    printf("%c",s[i]);
            }
        }
        printf("\n");
    }
    return 0;
}

Problem B

在喵呜镇有个古老的故事,传说以前有五只喵呜在平分圆柱体的蛋糕,要求只准用三刀,结果有只自认为聪明的喵呜用了两刀将蛋糕分成了四分,第三刀砍死了一只喵呜……

流传到现在,已经演变成了著名的“喵呜问题”(友情提醒:“喵呜问题”不是那么容易解出的…):给出有多少只喵呜平分圆柱体蛋糕(每只喵呜一块,每块要一模一样)和切多少刀(可以横着切和纵着切,或者砍死喵呜,但不能少切),问最少需要砍死多少只喵呜?

输入:

两个数,mn表示喵呜数和刀数,(0<m,n<=100)

输出:

一个数,最少砍死的喵呜数,如果无论怎么切都无法完成任务,输出-1

样例输入:

5 3

样例输出:

1

由于要平均分成相同的快数,考虑设横着切a刀,竖着切b刀,砍死了c只喵呜,可以列出方程 a+b+c=n 和 (a+1)*2*b+c=m 消去c之后得 m-n=2*a*b-a+b,剩下的我们就可以直接暴力看满足式子  m-n=2*a*b-a+b 和 a+b<=n 和 (a+1)*2*b<=m中 得到(a+b)的最大值之后,用n减去这个就得到砍死喵呜最少的只数。

#include <cstdio>
#include <cmath>
#include <algorithm>
using namespace std;
int main()
{
    int m,n;
    //freopen("b.in","r",stdin);
    //freopen("b.out","w",stdout);
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        int ans=0;
        for(int i=0;i<=100;i++)
        for(int j=0;j<=100;j++)
        {
            if(2*i*j-i+j==m-n&&i+j<=n&&(i+1)*2*j<=m)
            {
                ans=max(i+j,ans);
            }
        }
        printf("%d\n",n-ans);
    }
    return 0;
}


Problem C

喵呜大神最近发现由于喵呜迷上了吃蛋糕,体积一天天变大,这让喵呜大神感到压力倍增,于是喵呜大神决定开展喵呜镇的“阳光长跑”活动,到每个建筑物的时候需要喵呜一声,建筑物上有个仪器能够将喵呜声音记下来,由于每只喵呜的喵呜声是不一样的,因此仪器可以清楚的分辨不同的喵呜,喵呜们一周需要跑两次,每次必须在十五分钟内跑完,不然不算,喵呜可以从任意一个建筑物开始跑,绕一圈后回到起点才算成绩……

为了保证喵呜们的运动量,所以测量跑步路线长度的时候统一按照最短路线,而且必须跑外道!(具体路线如图中箭头所示,也就是从每个圆相切的地方离开并且跑向下一个圆,从下一个圆相切的地方跑到再下一个圆)。现在知道喵呜镇的建筑物都是圆柱体,而且半径都相等,现在给出三个圆柱体的底面圆心的坐标,问测量出来的跑步路线长度是多少?(圆周率pi3.14)



输入:

输入7个实数,分别表示圆柱体横截面的半径和三个圆柱体横截面圆心的坐标r x1 y1 x2 y2 x3 y3,其中0<r<50<=x1,x2,x3,y1,y2,y3<1000

输出:

一个实数,喵呜跑一圈的长度,保留两位小数。

样例输入:

1 0 0 0 1 1 0

样例输出:

9.69

根据数学知识可以知道,这个外围的距离有三段线段和三段圆弧组成,这三段线段就是三个圆心间的距离,而这三段圆弧恰好组成一个圆...

#include <cstdio>
#include <cmath>
#include <algorithm>
#define pi 3.14
using namespace std;
struct point
{
    double x,y;
};
double dis(point a,point b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
point p[3];
int main()
{
    //freopen("c.in","r",stdin);
    //freopen("c.out","w",stdout);
    double r;
    while(scanf("%lf%lf%lf%lf%lf%lf%lf",&r,&p[0].x,&p[0].y,&p[1].x,&p[1].y,&p[2].x,&p[2].y)!=EOF)
    {
        double ans=0;
        ans+=dis(p[0],p[1])+dis(p[1],p[2])+dis(p[0],p[2]);
        ans+=pi*2*r;
        printf("%.2lf\n",ans);
    }
    return 0;
}

Problem D

话说喵呜镇最近推行节能的活动,从每件小事做起,由于喵呜镇的阳光长跑的声音监测系统很耗电(因为全天开着),因此喵呜大神希望每一周第一个跑的喵呜把系统打开,最后一个跑的喵呜把系统关掉,但是有一天,他发现上周最后一个跑的喵呜没有把系统关掉,因此想找到这只喵呜扑杀掩埋处理(好野蛮……),但是很可惜系统里虽然有每只喵呜跑步结束的时间,但是并没有按照时间排序,显得凌乱不堪,一时之间还真不好找,现在希望你能帮助他找出上周最后一个跑的喵呜的编号。

输入的数据格式为:

第几天 第几小时 第几分钟 第几秒

例如

4 23 59 59

就表示该喵呜第4天第23小时第5959秒完成的本周阳光长跑活动。

输入:

第一行输入n(0<n<1000),表示n只喵呜

接下来2-n+1行,第i+1行有4个数,表示第i只喵呜在第a(1<=a<=7)天第b(0<=b<=23)小时第c分钟第d(0<=c,d<=59)秒完成本周的阳光长跑活动。

输出:

一个数,喵呜的编号,表示该喵呜本周最后一个完成阳光长跑

样例输入:

2

1 2 3 4

2 3 4 5

样例输出:

2

题目意思就是排序得到最后一只喵呜的编号。。

可以用排序做,也可以转化成时间即秒数,在排序比较也行。

#include <cstdio>
#include <iostream>
#include <algorithm>
using namespace std;
struct miao
{
    int d,h,m,s,no;
};
miao mi[1001];
bool cmp(miao a,miao b)
{
    if(a.d==b.d)
    {
        if(a.h==b.h)
        {
            if(a.m==b.m)
            {
                return a.s<b.s;
            }
            return a.m<b.m;
        }
        return a.h<b.h;
    }
    return a.d<b.d;
}
int main()
{
    //freopen("d.in","r",stdin);
    //freopen("d.out","w",stdout);
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
        {
            scanf("%d%d%d%d",&mi[i].d,&mi[i].h,&mi[i].m,&mi[i].s);
            mi[i].no=i;
        }
        sort(mi+1,mi+1+n,cmp);
        printf("%d\n",mi[n].no);
    }
    return 0;
}


Problem E

最近魔方又风靡喵呜镇,喵呜镇的喵呜们都有自己的魔方,但是由于喵呜们的习俗,比较喜欢奇数而讨厌偶数,因此市面上出售的魔方都是奇数阶的(显然没有一阶的魔方,喵呜们没有脑残到这个地步……魔方永远是6个面,阶数代表每条棱上有多少个小正方体,具体如图…)。有些喵呜学艺不精或者拥有成百上千阶的魔方,使得他们拼不回来,于是他们想把魔方拆散了重装,但是他们需要知道哪两个颜色是相对的,因此,他们需要根据现在打乱了的魔方来确定相对的颜色,给定魔方的六个面,求哪两个颜色是相对的。


上图是魔方的展开图,按照图示1--6序输入6个矩阵,表示该面的颜色,其中颜色用1--6表示。


输入:

第一行输入一个整数n(保证n为奇数且3<=n<=100)

接下来输入六个n*n的矩阵,对应上面展开图的1--6的面,每个矩阵上的数字代表展开图上每个矩形上的每个小方块的颜色

输出:

按照下列格式输出

1-颜色1对面的颜色

2-颜色2对面的颜色

3-颜色3对面的颜色

4-颜色4对面的颜色

5-颜色5对面的颜色

6-颜色6对面的颜色

样例输入

3

1 1 1

1 1 1

1 1 1

2 2 2

2 2 2

2 2 2

3 3 3

3 3 3

3 3 3

4 4 4

4 4 4

4 4 4

5 5 5

5 5 5

5 5 5

6 6 6

6 6 6

6 6 6

样例输出:

1-6

2-4

3-5

4-2

5-3

6-1


呃。。。由于魔方再怎么摆弄,每个面中心的那个是不变的,所以这题就是忽悠人的。。。

#include <stdio.h>
int a[101][101];
int b[101][101];
int c[101][101];
int d[101][101];
int e[101][101];
int f[101][101];
int main()
{
    int n;
    //freopen("e.in","r",stdin);
    //freopen("e.out","w",stdout);
    while(scanf("%d",&n)!=EOF)
    {
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&a[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&b[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&c[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&d[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&e[i][j]);
        for(int i=1;i<=n;i++)
            for(int j=1;j<=n;j++)
                scanf("%d",&f[i][j]);
        int nn=(n+1)/2;
        printf("1-%d\n",f[nn][nn]);
        printf("2-%d\n",d[nn][nn]);
        printf("3-%d\n",e[nn][nn]);
        printf("4-%d\n",b[nn][nn]);
        printf("5-%d\n",c[nn][nn]);
        printf("6-%d\n",a[nn][nn]);
    }
    return 0;
}

Problem F

话说最近喵呜镇颇不宁静,由于喵呜的天敌狗狗入侵喵呜镇,导致喵呜镇鸡犬不宁,现在喵呜大神站了出来,要与狗狗打上一架,不过由于小喵呜们看到狗狗就心慌四处逃窜,所以当喵呜大神面对狗狗士兵的时候,他惊讶的发现那些小喵呜们都已经不见了……在这万分危急的时候,喵呜大神只能使用两种绝招了……

绝招A:乾坤喵呜移,可以将一半的狗狗移到海里喂鲨鱼……但是如果狗狗数量为奇数时,使用这个绝招会导致天地阴阳错乱,后果不堪设想,所以喵呜大神不会在狗狗数量为奇数的时候用该绝招。

绝招B:降狗喵呜掌,可以秒杀一只狗狗……

使用绝招A和绝招B都需要耗费一单位的气力,问将狗狗们全部干掉最少需要耗费多少单位的气力?

输入:

一个数,狗狗的个数n(n<10000)

输出

一个数,表示喵呜大神最少耗费多少单位的气力

样例输入:

3

样例输出:

3


3n+1问题。。

#include <stdio.h>
int main()
{
    int n;
    while(scanf("%d",&n)!=EOF)
    {
        int ans=0;
        while(n)
        {
            if(n&1)
            {
                n--;
                ans++;
            }
            else
            {
                ans++;
                n/=2;
            }
        }
        printf("%d\n",ans);
    }
    return 0;
}

Problem G

喵呜镇的房价调控是很诡异的,让人有时候难以理解,而且更诡异的是,房价居然可以变成负数的,orz……

以下是喵呜镇某小区的房价示意图

0

3

-1

5

-1

2

其中的数字表示该房子的房价(万元)。

而房价调控的规则如下,相邻的两间房子(相邻:上下左右)可以同时涨任意多的价格,也可以同时降任意多的价格,例如上面的示意图,两个-1的可以同时涨1万元,而都变成0万元,也可以同时降10万元,变成-11万元……

喵呜大神对这个房价调控政策感到蛋疼,因此他希望重新制定房价调控政策,但是,他希望在实施新调控政策之前(也就是在原有政策下)先将所有房子的房价全部调整到0万元,请问是否存在一种调控方案能将所有房子的房价调整成0万元。

例如上图,两个-1都加1就都为0了,而35的两间房子可以同时下降3万元,然后5的那间房子由于下降了3万元,变成了2万元,再和右下角的那间房子同时都下降两万元,就变成0万元了,因此这种房价下有存在方案使得调控后所有房子的房价都为0万元。

输入:

第一行输入两个数mn(0<m,n<=100),代表小区房子俯视图的行数和列数

接下来m行,每行n个数,表示第m行第n列的房子的房价(每个房子的房价范围为-100~100)

输出:

如果经过某种调控方案后能够达到每个房子的房价均为0,那么输出"Possible",否则输出"Impossible",输出时去掉引号。

样例输入:

3 2

0 3

-1 5

-1 2

样例输出:

Possible


这个题,看了半天不知道咋做。。。然后现在知道了,如果自己拿几个简单的数字模拟就会发现,假设从右往左依次把右边的数便为0,然后从下往上减,变到左上角那个数字的时候,这个式子的值就是行和列数和为偶数的值减去行和列数和为奇数的数字,如果这个数字最后是0,那么就Possible否则 Impossible。

#include <stdio.h>
int main()
{
    int  s,a;
    int m,n;
    while(scanf("%d%d",&m,&n)!=EOF)
    {
        s=0;
        for(int i=0;i<m;i++)
            for(int j=0;j<n;j++)
            {
                scanf("%d",&a);
                if((i+j)&1)
                    s-=a;
                else
                    s+=a;
            }
        if(s==0)
            printf("Possible\n");
        else
            printf("Impossible\n");
    }
    return 0;
}



评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值