ACM Steps-Section(2)代码思路详解 ( HDU)

Acm Steps - HDU

昨天完成杭电ACM Steps中section one 之ACM 基本输入输出(C++语言实现)
感兴趣的可以去看看呀!ACM 基本输入输出-C++

今天中午到现在已经全部完成Section Two (写博客花费1小时间)

图片未加载请刷新网页
请刷新网页

提供Section2题集代码

Section2-Code

1.2.1 Climbing Worm
1.2.2 Text Reverse
1.2.3 find your present (2)
1.2.4 Quicksum
1.2.5 Balloon Comes!
1.2.6 IBM Minus One
1.2.7 ASCII
1.2.8 Vowel Counting

今天主要讲Climbing Worm 以及 find your present(2) 其实两道题都不难,主要讲讲思路和心得!

One 题目链接-find your present (2)

1,要读懂题意!
题目的意思是在所有卡片中找到奇数次的卡片number以及与其他卡片number不一样,
换句话说,我们需找到仅仅只出现一次的卡片number数。
2,如何找到呢?
思维误区:本想打算使用数组,卡片的序号就是数组的下标序号,当输入一个数字
那么该数组小标的值+1,最后遍历!但是不现实,因为输入的正整数的范围时不超过2^31
不可能设置如此之大范围的数组
3,另寻他路
既然有的数字会重复,那么我们先排序好吧!相同的数字肯定是在一起的。
然后遍历查找直到找到只出现一次的数字
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
int a[1000000];
int main()
{
    int N;
    while (scanf("%d", &N), N)
    {
        int i = 0;
        while(N--)
        {
            scanf("%d", &a[i++]);
        }
        sort(a, a + i);//排序
        int num = 0;//使用number来作标示
        int j;
        for (j = 1; j < i; j++)
        {
            if (a[j] == a[j - 1]) num++;//也就是相同的数字
            else {
                if (num == 0)//为0打印
               {
                   cout << a[j] << endl;
                   break;
               }
                else {//num不为0时不相同此时置num为0
                    num = 0;
                }
            }
        }
        if (j == i)//如果出现在最后
            cout << a[i - 1] << endl;
    }
    return 0;
}
为了辅助理解,3个测试用例如下
3 1 1 1 2 2 
1 1 1 3 2 2 2
1 1 2 2 2 3

Climbing Worm 主要说一下刚刚犯的错误

Two 题目链接-Climbing Worm
题意:假设这只昆虫为蜗牛,蜗牛每分钟往上爬u米,每分钟爬一次需要花一分钟来休息,休息过程中往下会滑d米,总高度为n米,问何时蜗牛可以到达终点?

依题意可知每次达到终点肯定是在爬u米的过程中,即是在上升的时候出现!
(因为如果下滑说明还未达到终点)

这里放一下错误代码!!!
(你是否能找出错误呢, 只需修改一处 我相信这个ERROR很多人可能会犯)

#include <iostream>
using namespace std;
int main()
{
    int n, u, d;
    while (cin >> n >> u >> d && (n))
    {
        for (int i = 1; ; i++)
        {
            if (i * (u - d) + u >= n)
            {
                cout << i * 2 + 1  << endl;
                break;
            }
        }
    }
    return 0;

}

正确代码参考题目集代码!

当然这里也给出最最最简单通俗易懂的代码
#include <iostream>
using namespace std;
int main()
{
    int n, u, d;
    while (cin >> n >> u >> d && (n))
    {
        int sum = 0;
        int k = 0;
        while(true)
        {
            sum += u;
            k++;
            if (sum >= n)
            {
                cout << k << endl;
                break;
            }
            sum -= d;
            k++;
        }
    }
    return 0;
}

Section 题目集代码如下,且都已Accept

1.2.1 Climbing Worm

#include <iostream>
using namespace std;

int main()
{
    int n, u, d;
    while (cin >> n >> u >> d && (n))
    {
        for (int i = 0; ; i++)//i初始值设为0,不可以设置为1
        {
            if (i * (u - d) + u >= n)
            {
                cout << i * 2 + 1  << endl;
                break;
            }
        }
    }
    return 0;

}

1.2.2 Text Reverse

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n;
    cin >> n;
    cin.get();
    while(n--) {
        string str;
        getline(cin, str);
        int k = 0;
        for (int i = 0; i <= str.length(); i++) {
            if (str[i] == ' ' || str[i] == '\0') {
                for (int j = i - 1; j >= k; j--)
                    cout << str[j];
                if (i != str.length())
                    cout << str[i];
                k = i + 1;
            }
        }
        cout << endl;
    }
    return 0;
}

1.2.3 find your present (2)

#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int a[1000000];
int main()
{
    int N;
    while (scanf("%d", &N), N)
    {
        int i = 0;
        while(N--)
        {
            scanf("%d", &a[i++]);
        }
        sort(a, a + i);
        int j;
        for (j = 1; j < i; j++)
        {
            if (a[j] == a[j - 1]) num++;
            else {
                if (num == 0)
               {
                   cout << a[j] << endl;
                   break;
               }
                else {
                    num = 0;
                }
            }
        }
        if (j == i)
            cout << a[i - 1] << endl;
    }
    return 0;
}

1.2.4 Quicksum

#include <iostream>
#include <string>
using namespace std;
int main()
{
    string str;
    int sum;
    while(getline(cin, str))
    {
        if (str[0] == '#') break;
        sum = 0;
        for (int i = 0; i < str.length(); i++)
        {
            if (str[i] == ' ');
            else
                sum += ((str[i] - '@') * (i + 1));
        }
        cout << sum << endl;
    }
    return 0;
}

1.2.5 Balloon Comes!

#include <iostream>
#include <iomanip>

using namespace std;

int main()
{
    int t;
    cin >> t;
    char ch; int a, b;
    cin.get();
    while(t--) {
        cin >> ch >> a >> b;
        switch(ch) {
            case '+':cout << a + b << endl;break;
            case '-':cout << a - b << endl;break;
            case '*':cout << a * b << endl;break;
            case '/':
                if (a % b == 0) cout << a / b << endl;
            else cout << setiosflags(ios::fixed) << setprecision(2) << (1.0 * a / b) << endl;
        }
    }
    return 0;
}

1.2.6 IBM Minus One

#include <iostream>
#include <string>
using namespace std;

int main()
{
    int n, i = 0;
    cin >> n;
    cin.get();
    string str;
    while(n--) {
        getline(cin, str);
        for(int i = 0; i < str.length(); i++) {
           if (str[i] == 'Z') str[i] = 'A';
           else str[i] = str[i] + 1;
        }
        cout << "String #" << ++i << endl <<  str << endl << endl;
    }
    return 0;
}

1.2.7 ASCII

#include <iostream>
using namespace std;
int a[1000];
int main()
{
    int T;
    int i = 0;
    cin >> T;
    while (i < T) {
        cin >> a[i++];
    }
    int j = 0;
    while (j < i)
        cout << char(a[j++]);
    return 0;
}

1.2.8 Vowel Counting

#include <iostream>
#include <string.h>
using namespace std;

int main()
{
    int T;
    string str;
    cin >> T;
    cin.get();
    while (T--)
    {
        getline(cin, str);

        for (int i = 0; i < str.length(); i++) {
            if (str[i] == 'a' || str[i] == 'e' || str[i] == 'i' || str[i] == 'o' || str[i] == 'u')
                str[i] =  str[i] - 32;
            else if (str[i] != 'A' && str[i] != 'E' && str[i] != 'I' && str[i] != 'O' && str[i] != 'U')
            {
                if (str[i] <= 90)
                    str[i] =  str[i] + 32;
            }
        }
        cout << str << endl;
    }
    return 0;
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值