HDOJ1001-1005题解

简介:

1001--Sum Problem(http://acm.hdu.edu.cn/showproblem.php?pid=1001

#include <stdio.h>

int sum(int n)
{
    if(n % 2) 
        return (n + 1) / 2 * n;
    else
        return (n / 2) * (n + 1);
}

int main()
{
    int n;
    while(scanf("%d",&n) != EOF){
        printf("%d\n\n",sum(n));
    }
    return 0;
}

1002--A + B Problem II(http://acm.hdu.edu.cn/showproblem.php?pid=1002

简单题:大数的运算

注意格式(Case的首字母大写、各种空格、每一行之间有空行,最后一行没有空行)!

给出几组测试数据:

6
1 2
1 0
9999 1
1 999999
5555 4445
112233445566778899 998877665544332211

#include<stdio.h>
#include<string.h>
#include<stdlib.h>
void solve()
{
    int n,i,j,k,flag,t,cas,L;
    char a[1001],b[1001],c[1002];
    scanf("%d",&n);
    getchar();
    cas=1;
    while(n--)
    {
        flag=0;
        memset(a,'\0',sizeof(a));
        memset(b,'\0',sizeof(b));
        memset(c,'\0',sizeof(c));
        scanf("%s",a);
        scanf("%s",b);
        printf("Case %d:\n",cas);
        printf("%s",a);
        printf(" + ");
        printf("%s",b);
        printf(" = ");
        strrev(a);
        strrev(b);
        k=i=0;
        L=(strlen(a)>strlen(b)?strlen(b):strlen(a));
        while(i<L)
        {
            t=(a[i]-'0')+(b[i]-'0')+flag;
            flag=(t>=10?1:0);
            c[k++]=t%10+'0';
            i++;
        }
        if(a[i]=='\0')
        {
            while(b[i]!='\0') {
                t=b[i++]-'0'+flag;
                c[k++]=t%10+'0';
                flag=(t>=10?1:0);
            }
        }
        else
        {
            while(a[i]!='\0') {
                t=a[i++]-'0'+flag;
                c[k++]=t%10+'0';
                flag=(t>=10?1:0);
            }
        }
        if(flag) c[k]='1';
        else k--;
        while(k>=0)
        {
            printf("%c",c[k]);
            k--;
        }
        printf("\n");
        if(n>0) printf("\n");
        cas++;
    }
}

int main()
{
    solve();
    return 0;
}

1003--Max Sum(http://acm.hdu.edu.cn/showproblem.php?pid=1003

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

void solve()
{
    int T, i, max,sum,n,num,begin,end,t,con;
    while(cin>>T) {
        for(i = 1; i <= T; i++) {
            max = -1000000;
            sum = 0;
            n = con = 0;
            cin>>n;
            num = n;
            begin = end = 0;
            while(n--) {
                cin>>t;
                sum += t;
                con++;
                if(sum > max) {
                    begin = con;
                    max = sum;
                    end = num - n;
                }
                if(sum < 0) {
                    sum = 0;
                    con = 0;
                }
            }
            cout<<"Case "<<i<<":"<<endl<<max<<" "<<end-begin+1<<" "<<end<<endl;  
            if(i != T) cout<<endl;  
        }
    }
}

int main()
{     
    solve();
    return 0;
}

1004--Let the Balloon Rise(http://acm.hdu.edu.cn/showproblem.php?pid=1004

#include<iostream>
#include<cstdio>
#include<map>
#include<string>
#include<cstring>
using namespace std;

void solve()
{
    int T, max, t;
    map<string, int> color_count;
    string color;
    while(cin>>T && T) {
        max = 0;
        while(T--) {
            cin>>color;
            ++color_count[color];
        }
        map<string, int>::const_iterator ii, it;
        it = color_count.begin();
        while(it != color_count.end()) {
            if(max < it->second) {
                max = it->second;
                ii = it;
            }
            it++;
        }
        cout<<ii->first<<endl;
        color_count.clear();
    }
}

int main()
{     
    solve();
    return 0;
}

1005--Number Sequence(http://acm.hdu.edu.cn/showproblem.php?pid=1005

#include<iostream>
using namespace std;

void solve()
{
    int A, B, n;
    while(cin>>A>>B>>n && (A || B || n)) {
        int a[2] = {1, 1};
        for(int i = 0; i < (n %49 - 1) / 2; i++) {
            a[0] = (A * a[1] + B * a[0]) % 7;
            a[1] = (A * a[0] + B * a[1]) % 7;
        }
        if(n % 2) {
            cout<<a[0]<<endl;
        } else {
            cout<<a[1]<<endl;
        }
    }
}

int main()
{
    solve();
    return 0;
}
目录
相关文章
|
4月前
leetcode-1447:最简分数
leetcode-1447:最简分数
42 0
|
4月前
leetcode-475:供暖器
leetcode-475:供暖器
37 0
|
索引
leetcode第46题
这是自己开始想到的一个方法,考虑的思路是,先考虑小问题怎么解决,然后再利用小问题去解决大问题。没错,就是递归的思路。比如说, 如果只有 1 个数字 [ 1 ],那么很简单,直接返回 [ [ 1 ] ] 就 OK 了。 如果加了 1 个数字 2, [ 1 2 ] 该怎么办呢?我们只需要在上边的情况里,在 1 的空隙,也就是左边右边插入 2 就够了。变成 [ [ 2 1 ], [ 1 2 ] ]。
leetcode第46题
|
算法
leetcode第34题
第二种思路,参考这里。 我们开始更新 start 的时候,是 mid + 1,如果剩两个元素,例如 2 4,target = 6 的话,此时 mid = 0,start = mid + 1 = 1,我们返回 start + 1 = 2。如果 mid 是右端点,那么 mid = 1,start = mid + 1 = 2,这样就可以直接返回 start 了,不需要在返回的时候加 1 了。
leetcode第34题
leetcode第54题
在 leetcode 的 solution 和 discuss 看了下,基本就是这个思路了,只是实现上有些不同,怎么用来标记是否走过,当前方向,怎么遍历,实现有些不同,但本质上是一样的。就是充分理解题意,然后模仿遍历的过程。
leetcode第54题
|
存储
leetcode第56题
常规的思想,将大问题化解成小问题去解决。 假设给了一个大小为 n 的列表,然后我们假设 n - 1 个元素的列表已经完成了全部合并,我们现在要解决的就是剩下的 1 个,怎么加到已经合并完的 n -1 个元素中。 这样的话分下边几种情况, 我们把每个范围叫做一个节点,节点包括左端点和右端点。 1. 如下图,新加入的节点左端点和右端点,分别在两个节点之间。这样,我们只要删除
leetcode第56题
|
存储 算法
leetcode第43题
个位乘个位,得出一个数,然后个位乘十位,全部乘完以后,就再用十位乘以各个位。然后百位乘以各个位,最后将每次得出的数相加。十位的结果要补 1 个 0 ,百位的结果要补两个 0 。相加的话我们可以直接用之前的大数相加。直接看代码吧。
leetcode第43题
|
存储 算法
leetcode第49题
时间复杂度:两层 for 循环,再加上比较字符串,如果字符串最长为 K,总的时间复杂度就是 O(n²K)。 空间复杂度:O(NK),用来存储结果。 解法一算是比较通用的解法,不管字符串里边是大写字母,小写字母,数字,都可以用这个算法解决。这道题的话,题目告诉我们字符串中只有小写字母,针对这个限制,我们可以再用一些针对性强的算法。 下边的算法本质是,我们只要把一类的字符串用某一种方法唯一的映射到同一个位置就可以。
144 0
leetcode第49题
leetcode第53题
解法一和解法二的动态规划,只是在定义的时候一个表示以 i 开头的子数组,一个表示以 i 结尾的子数组,却造成了时间复杂度的差异。问题就是解法一中求出了太多的没必要的和,不如解法二直接,只保存最大的和。
leetcode第53题