2011年吉林大学ACM一年级新生选拔赛题解


总共六道题,质量挺好的,适合大一新手,第三题找规律把我坑了一下,4次提交....可怜的罚时啊.....

第一题:三角形的边

一道简单的排序题,将三个数排序,输出前两个和减去最大的.....主要的就是熟悉一下ACM的I/O环境。

普通方法不教了,教一个懒人方法,直接定义一个数组,sort一下,sort是再algorithm的函数。

#include 
#include 
using namespace std;

int a[3];

int main()
{
    while (cin >> a[0] >> a[1] >> a[2])
    {
        if (a[0] == 0 && a[1] == 0 && a[2] == 0)
            break;
        sort(a, a + 3);
        cout << a[0] + a[1] - a[2];
    }
    return 0;
}


 

第二题:字符串的反码

挺不错的字符串处理题.....先读入字符串,之后根据要求变换输出,注意一点,有可能存在!XX的情况,这样就要判断读入的字符串第一个是!第二是0;

代码:

#include 
#include 
#include 
using namespace std;

char change(char x)
{
    if (x >= 'A' && x <= 'Z')
        return (char)('Z' - (x - 'A'));
    else
    if (x >= 'a' && x <= 'z')
        return (char)('z' - (x - 'a'));
    else
        return x;
}

int main()
{
    string str;
    while (cin >> str)
    {
        if (str[0] == '!' && str[1] == 0)
            break;
        for (int i = 0; str[i]; ++i)
        {
            str[i] = change(str[i]);
        }
        cout << str << endl;
    }
    return 0;
}

 

第三题:Greedy niky

一道找规律的题,首先我们确定一点,就是四面体某个面压的土地是固定的,所以我们将土地分成四类,在图上给的16个三角形划分出来,不难发现编号%4余1的和1号一样,%4余3的和3号一样,之后我们不难发现,1,3一组,2,4一组,在每一行的交替出现的,131313或者24242....而行的关系是,每组出现两次,13组出现两行,之后24组出现两行.....之后按照这个规律把1000以内的土地所属的类分出来就行了。

#include 
#include 
#include 
using namespace std;

int f[1010];

void init()
{
    f[1] = 1, f[2] = 2, f[3] = 3, f[4] = 4, f[6] = 4;
    for (int i = 1; i < 1005; ++i)
    {
        if (i % 4 == 1)
            f[i] = 1;
        if (i % 4 == 3)
            f[i] = 3;
    }
    int type = 4;
    int num = 1;
    int t, flag = 0;
    for (int i = 1; i <251;)
    {
        for (int j = 0; j < num; ++j)
        {
            f[i * 4] = type;
            i++;
        }
        int x = i - 1;
        if (type == 4)
            t = num;
        else
            t = num + 1;
        if (flag)
        {
            while (t--)
            {
                f[x * 4 + 2] = type;
                x++;
            }
        }
        else
            flag = 1;
        if (type == 2)
        {
            type = 4;
            num++;
        }
        else
            type = 2;
    }
}

int main()
{
    int n, m;
    init();
    while (scanf("%d%d", &n, &m) != EOF)
    if (f[n] == f[m])
        puts("yes");
    else
        puts("no");
    return 0;
}

 

第四题:Pocket Money Plan

一道模拟题,按着它说的做,每做一次天数加1就行了。

代码:

#include 
#include 
#include 
using namespace std;

int main()
{
    int Case, m;
    cin >> Case;
    while (Case--)
    {
        int d = 0;
        cin >> m;
        while (m)
        {
            d++;
            double tmp = m;
            int c = m;
            tmp /= 10;
            c = c - ceil(tmp);
            m = c;
        }
        cout << d << endl;
    }
    return 0;
}


 

第五题:供热管道优化

因为题目要求是一条垂直与x的轴的,所以y坐标明显废了,因为点到这个线肯定是垂直的,所以距离就是这个线的x坐标和那个点的x坐标之差了。将x坐标排序,去中间的,之后累加别的x到这个中位的距离就行了。

代码:

#include 
#include 
#include 
using namespace std;

int fabs(int x)
{
    if (x > 0)
        return x;
    else
        return -x;
}

int main()
{
    int x[1510], y[1510];
    int n;
    while (cin >> n && n)
    {
        for (int i = 0; i < n; ++i)
            cin >> x[i] >> y[i];
        sort(x, x + n);
        int t, sum = 0;
        t = x[(n + 1) / 2 - 1];
        for (int i = 0; i < n; ++i)
            sum += fabs(x[i] - t);
        cout << sum << endl;
    }
    return 0;
}


 

第六题:Just the Facts

求解n的阶乘第一位不为0的数是几,a[i]数组记录是i这个数阶乘第一位不为0的是几....之后递推到1000就行了.....

如果i这个数不能被5整出,那么a[i] = (a[i - 1] * i) % 10;

如果i被5整出,就是 a[i] = b[(n - 1) % 4 + 1] * a[n] % 10;

代码:

#include 
#include 
using namespace std;

long long a[10010], b[5] = {0, 2, 4, 8, 6};

int main()
{
    int n, m;
    a[0] = 0, a[1] = 1, a[2] = 2, a[3] = 6, a[4] = 4, a[5] = 2;
    for (int i = 6; i < 10001; ++i)
    {
        m = i % 5;
        n = i / 5;
        if (m != 0)
            a[i] = a[i - 1] * i % 10;
        else
            a[i] = b[(n - 1) % 4 + 1] * a[n] % 10;
    }
    while (scanf("%d", &n) != EOF)
        printf("%5d -> %d\n", n, a[n]);
    return 0;
}


 

 

你可能感兴趣的:(大学的nothing)