杭电算法题 HDU 1000-1004

h1,h2,h3,h4,h5,h6,p,blockquote { margin: 0; padding: 0 }
body { font-family: "Helvetica Neue", Helvetica, "Hiragino Sans GB", Arial, sans-serif; font-size: 13px; line-height: 18px; color: #737373; background-color: white; margin: 10px 13px 10px 13px }
table { margin: 10px 0 15px 0; border-collapse: collapse }
td,th { border: 1px solid #ddd; padding: 3px 10px }
th { padding: 5px 10px }
a { color: #0069d6 }
a:hover { color: #0050a3; text-decoration: none }
a img { border: none }
p { margin-bottom: 9px }
h1,h2,h3,h4,h5,h6 { color: #404040; line-height: 36px }
h1 { margin-bottom: 18px; font-size: 30px }
h2 { font-size: 24px }
h3 { font-size: 18px }
h4 { font-size: 16px }
h5 { font-size: 14px }
h6 { font-size: 13px }
hr { margin: 0 0 19px; border: 0; border-bottom: 1px solid #ccc }
blockquote { padding: 13px 13px 21px 15px; margin-bottom: 18px; font-family: georgia, serif; font-style: italic }
blockquote::before { content: "“"; font-size: 40px; margin-left: -10px; font-family: georgia, serif; color: #eee }
blockquote p { font-size: 14px; font-weight: 300; line-height: 18px; margin-bottom: 0; font-style: italic }
code,pre { font-family: Monaco, Andale Mono, Courier New, monospace }
code { background-color: #fee9cc; color: rgba(0, 0, 0, 0.75); padding: 1px 3px; font-size: 12px }
pre { display: block; padding: 14px; margin: 0 0 18px; line-height: 16px; font-size: 11px; border: 1px solid #d9d9d9; white-space: pre-wrap }
pre code { background-color: #fff; color: #737373; font-size: 11px; padding: 0 }
sup { font-size: 0.83em; vertical-align: super; line-height: 0 }
* { }


1000 A+B Problem

#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
    int a,b;
    while(cin>>a>>b){
        cout<<a+b<<endl;
    }
    return 0;
}

Tips:

这题唯一需要注意的地方应该就是读取数据的问题,知道怎么样使用while(cin>>a>>b)或者while(scanf("%d %d",&a,&b) != EOF)来保证读数据读到数据末。


1001 Sum Problem

#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
    int n;
    int sum;
    while(cin>>n){
        if(n%2 == 0)sum = n/2*(n+1);
        else sum = (n+1)/2 * n;
        cout<<sum<<endl;
        cout<<endl;
    }
    return 0;
}

Tips:

首先第一个要注意的就是这题要求再每个输出后面再多加一个换行,这是一个可能漏看的点。这题如果用1到n的循环累加提交应该不会报错。但如果用高斯公式的话,用(n+1)*n/2会造成数据溢出,需要先除2再相乘,但因为int类型不能整除会被自动略去小数部分,所以需要先判断n和n+1哪个可以被2整除。


1002 A+B Problem II

#include <iostream>
using namespace std;
//将字符转为数字
int transCtoI(char c){
    switch (c){
        case ‘0‘:return 0;
        case ‘1‘:return 1;
        case ‘2‘:return 2;
        case ‘3‘:return 3;
        case ‘4‘:return 4;
        case ‘5‘:return 5;
        case ‘6‘:return 6;
        case ‘7‘:return 7;
        case ‘8‘:return 8;
        case ‘9‘:return 9;
    }
    return 0;
}
//将数字转为字符
char transItoC(int i){
    switch (i){
        case 0:return ‘0‘;
        case 1:return ‘1‘;
        case 2:return ‘2‘;
        case 3:return ‘3‘;
        case 4:return ‘4‘;
        case 5:return ‘5‘;
        case 6:return ‘6‘;
        case 7:return ‘7‘;
        case 8:return ‘8‘;
        case 9:return ‘9‘;
    }
    return 0;
}
//将字符串翻转
string trans(string s){
    char temps;
    for(int i = 0 ;i < s.length() / 2 ; i++){
        temps = s[i];
        s[i] = s[s.length() -i - 1];
        s[s.length() -i - 1] = temps;
    }
    return s;
}

int main(int argc, const char * argv[]) {
    int cnt = 1,max,next = 0,temp = 0 , num1 = 0 , num2 = 0;
    string str1,str2,sum="";
    cin>>max;
    while(max > 0){
        sum = "";num1 = 0 ;num2 = 0;next = 0;temp = 0;
        cin>>str1>>str2;
        cout<<"Case "<<cnt++<<":"<<endl;
        cout<< str1 << " + "<<str2 <<" = ";
        str1 = trans(str1);
        str2 = trans(str2);
        for(int i = 0 ;i <str1.length()||i < str2.length();i++){
            //取每个字符将它转为数字,如果该字符下标已超出字符串长度,则将它设置等于0
            if(i < str1.length())
                num1 = transCtoI(str1[i]);
            else
                num1 = 0;
            if(i < str2.length())
                num2 = transCtoI(str2[i]);
            else
                num2 = 0;
            //计算出当前位相加后的数字并取模
            temp = (( num1 +  num2 + next) % 10);
            //如果当前位数字相加大于10则进位
            if((num1 + num2 + next) >= 10)
                next = 1;
            else
                next = 0;
            sum += transItoC(temp);
        }
        //如果最后的一位加法有进位,那要再字符串首加一
        if(next == 1)
            sum += "1";
        //注意要逆序输出
        for(int i = sum.length() - 1;i >=0 ;i--)cout<<sum[i];
        cout<<endl;
        max --;
        if(max > 0 )
        cout<<endl;
    }
    return 0;
}

Tips:

这个应该考验的是大家高精度算法。首先第一个要注意的就是要用字符串来存储数字而不是int、long等,这样依然会造成数据溢出。第二就是要如何将字符类型和数字类型的进行转换,因为c++本身似乎不提供这个函数,自己写一个也是很方便的。最后要注意的就是进位问题。


1003 Max Sum

#include <iostream>
using namespace std;
int main(int argc, const char * argv[]) {
    int t,n,max = -1001;
    int a[1000001],sum = 0 , cnt = 1;
    int head = 0 ,tail = 0;
    int temphead = 0 , temptail = 0;
    cin>>t;

    while(t-- > 0){
        cin>>n;
        sum =  temphead = temptail = head = tail = 0;
        max = -1001;
        for(int i = 0 ;i < n ; i++){
            cin>>a[i];
            sum += a[i];
            if(sum > max){
                max = sum;
                head = temphead;
                tail = i;
            }
            if(sum < 0 ){
                temphead = i + 1 ;
                sum = 0;
            }
        }

        cout << "Case "<<cnt++<<":"<<endl;
        cout << max << " " <<head+1 << " " << tail+1 <<endl;
        if(t != 0)cout<<endl;
    }
    return 0;
}

Tips:

本题就是求一个最大子序列问题,一开始我以为会超级复杂。后来在网上看了题解之后惊讶才这么点代码?果然学好数学很重要。

这题可以用暴力求解的方式,遍历每种子序列的组合。比如序列(6,-1,5,4,7)

子序列组合:

6,(6,-1),(6,-1,5),(6,-1,5,4),(6,-1,5,4,7)

-1,(-1,5),(-1,5,4),(-1,5,4,7)

5,(5,4),(5,4,7)

4,(4,7)

7

这题要求的是子序列的最大和,所以如果一个子序列的和小于0,那么这个序列加上下一个数字,一定比单独这个数字的值还要小,所以可以重新以下一个数字开始计算子序列。这就是这个代码变的如此简洁的原因。


1004 Let the Balloon Rise

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

int main(int argc, const char * argv[]) {
    string str[1001];
    string s = "";
    map<string,int> amap;
    map<string,int>::iterator iter;
    int n , max = 0;
    cin>>n;
    while (n != 0) {
        max = 0;s = "";amap.clear();
        for(int i = 0; i < n; i++){
            cin>>str[i];
            //查找是否在map中已存在这个颜色,存在则该颜色数量加一,不存在则在map中插入该颜色
            iter = amap.find(str[i]);
            if(iter != amap.end()){
                amap[str[i]] = amap[str[i]] + 1;
            }
            else{
                amap[str[i]] = 1;
            }
        }
        //遍历map,查找其中次数最多的颜色
        for(iter = amap.begin() ; iter != amap.end(); iter++){
            if(iter->second > max){
                max = iter->second;
                s = iter->first;
            }
        }
        cout<<s<<endl;
        cin>>n;
    }
    return 0;
}

Tips:

这题主要就是统计出现过的字符串,这里用了map这个容器来实现,其中map<string,int>::iterator iter声明的iter是一个类似于指针的变量,从代码中可以看出要找一个map中存在的键值或者是遍历map中的值都需要借助iter来实现。当然也可以开两个一维数组,一个存字符串一个存出现的个数,那样可能就会比较简单一点。

时间: 2024-11-08 01:59:51

杭电算法题 HDU 1000-1004的相关文章

杭电dp题集,附链接

Robberies 点击打开链接 背包;第一次做的时候把概率当做背包(放大100000倍化为整数):在此范围内最多能抢多少钱  最脑残的是把总的概率以为是抢N家银行的概率之和- 把状态转移方程写成了f[j]=max{f[j],f[j-q[i].v]+q[i].money}(f[j]表示在概率j之下能抢的大洋); 正确的方程是:f[j]=max(f[j],f[j-q[i].money]*q[i].v)  其中,f[j]表示抢j块大洋的最大的逃脱概率,条件是f[j-q[i].money]可达,也就是

杭电水题

杭电OJ上的水题:C语言程序设计练习 题目如下: 链接: http://acm.hdu.edu.cn/showproblem.php?pid=2001 注:pid=后面可以为2000 - 2050中的任何一个(对应50道题目) 另外也可以做1000之后的(按顺序做,从1000开始把,1000开头的都蛮简单的) 原文地址:https://www.cnblogs.com/wyb666/p/10909202.html

acm入门 杭电1001题 有关溢出的考虑

最近在尝试做acm试题,刚刚是1001题就把我困住了,这是题目: Problem Description In this problem, your task is to calculate SUM(n) = 1 + 2 + 3 + ... + n. Input The input will consist of a series of integers n, one integer per line Output For each case, output SUM(n) in one line

小试牛刀-搜索基础入门(杭电五题)

hdu 1241 Oil Deposits 水题,BFS,判断区域的块数. 代码清单: #include<queue> #include<cstdio> #include<cstring> #include<iostream> #include<algorithm> using namespace std; typedef pair<int,int>P; int m,n; char s[105][105]; int xy[8][2]=

动态规划解决杭电OJ1080题——LCS的变种

首先上题目: Human Gene Functions Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 65536/32768 K (Java/Others) Total Submission(s): 2570    Accepted Submission(s): 1451 Problem Description It is well known that a human gene can be considered as a se

水题/hdu 1000 A + B problem

题意 输入a,b,输出a+b: 分析 注意多case Accepted Code 1 /* 2 PROBLEM:hdu1000 3 AUTHER:NicoleLam 4 MEMO:水题 5 */ 6 7 #include<cstdio> 8 int main() 9 { 10 int a,b; 11 while (scanf("%d%d",&a,&b)!=EOF) printf("%d\n",a+b); 12 return 0; 13 }

杭电一水题(DFS)Untitled

Problem Description There is an integer a and n integers b1,…,bn. After selecting some numbers from b1,…,bn in any order, say c1,…,cr, we want to make sure that a mod c1 mod c2 mod… mod cr=0 (i.e., a will become the remainder divided by ci each time,

杭电二分题

Description Now, here is a fuction: F(x) = 6 * x^7+8*x^6+7*x^3+5*x^2-y*x (0 <= x <=100) Can you find the minimum value when x is between 0 and 100. Input The first line of the input contains an integer T(1<=T<=100) which means the number of te

Dijk入门(杭电2544题)

#include<iostream> #include<cstring> using namespace std; #define INF 0x3f3f3f3f int n,m; int map[105][105]; int vis[105]; int stemp[105]; int dijk(){ memset(vis,0,sizeof(vis)); vis[1]=1; //标记第一个已选 memset(stemp,0,sizeof(stemp)); int min; int f