当前位置: 首页 > 工具软件 > bmm-cpp > 使用案例 >

几个cpp程序

锺离晗昱
2023-12-01

A:百度计算器的加法

时间限制: 1000ms 内存限制: 10000kB

描述
百度框计算中提供了计算器这个功能,模拟计算器中的复杂功能,我们最先需要解决的就是实现加法模块。今天就给你个机会,和百度计算器一样,计算一下十以内的加法吧。

输入
仅有一组数据,包含两个正整数,分别为a, b(0 <= a, b <= 10)

输出
一个正整数,暨输入a, b后对应的a+b的计算结果

样例输入
5 2

样例输出
7

#include <iostream>

using namespace std;

int main()
{
    int a;
    int b;

    cin >> a >> b;
    cout << a + b << endl;


    return 0;
}

B:小诺爱USB设备

时间限制: 1000ms 内存限制: 65536kB

描述
在百度工作的小诺是一个USB设备迷,在他桌上有一堆的USB设备——USB鼠标、USB小音箱、USB按摩器……但是,公司配给小诺的ThinkPad X系列的电脑只有一个能用的USB接口。不过还好,小诺有一堆的USB Hub,可以把一个可用的USB接口变成多个USB接口。但是,小诺很难确定这些USB Hub能否满足他他众多的USB设备的需求。

输入
输入首行包括一个整数N(1 ≤ N ≤ 20),表示测试数据组数。接下去的N行,每行包括一组测试数据。每组测试数据行以一个整数K开头(1 ≤ K ≤ 10),表示这组测试数据提供的USB Hub的数量;紧接着,在同一行,有K个整数(每两个整数之间由一个空格分隔开),{M1,M2…Mi…MK}(2 ≤ Mi ≤ 10),每个整数表示了这个USB Hub能将一个USB接口数变成的多个USB接口的数量。

输出
针对每组测试数据输出一个结果,表示小诺用这组提供的USB Hub后,能最多使用的USB设备的数量。每个输出占一行。

样例输入
3
2 2 2
3 3 2 4
6 2 2 2 3 4 5

样例输出
3
7
13

#include <iostream>

using namespace std;

int main()
{
    int lines;
    int n;
    int sum;
    int t;

    cin >> lines;

    while(lines) {
        cin >> n;

        sum = 0;
        for(int i=0; i<n; ++i) {
           cin >> t;
           sum += t;
        }
        cout << sum - (n -1) << endl;

        --lines;
    }

    return 0;
}

C:易手机的套餐

时间限制: 1000ms 内存限制: 10000kB

描述
装载百度易平台的易手机已经上市,为了更好的为大家提供服务。百度与合作的运营商正在讨论为易手机用户推出一款特别的套餐,帮助大家更好的利用易手机。作为这个项目负责人的晓萌调研了大量用户使用这个套餐后会出现的资费预估,让我们来看看这个特别的套餐到底会带来怎样资费情况吧。

输入
输入数据包括十二行,每行包括一个数字(不含金钱符号$),表示晓萌调研的某一用户使用特别套餐后,一月到十二月消费的资费情况。每行包括的这个数字精确到小数点后两位。

输出
输出仅一行,表示用户使用该套餐后,针对给出的12个月的资费的均值情况。在分位采用四舍五入进位。输出以金钱符号$开头,输出中不含空格等其它特别字符。

样例输入
112.00
249.12
214.12
34.10
223.05
109.20
53.27
102.25
239.18
95.99
95.01
25.75

样例输出
$129.42

#include <iostream>

using namespace std;

int main()
{
    double d;
    double sum = 0;

    for(int i=0; i<12; ++i) {
        cin>>d;
        sum += d*100;
    }

    cout.setf(ios::fixed);
    cout.precision(2);
    cout<<'$' << sum/12/100 << endl;

    return 0;
}


D:共同狂欢

时间限制: 1000ms 内存限制: 131072kB

描述
百度2005年8月5日上市时,在北京和纳斯达克的同学们每一个小时整点时就会通一次电话,对一下表,确认一切相关活动都精确同步。但是要注意,在两边的同学位于不同的时区,在夏时制时,两地时差12小时,因此,每次对表都需要做一下时区转换。你来帮我们完成这个有点麻烦的工作吧。

输入
输入的第一行包括一个整数T(T ≤ 30),表示测试数据的组数;接下去的T行每行包括一个时间,表示两地中的一个地方同学报出的整点的时间,表示成“H:M”的形式,其中H是小时(0 ≤ H < 24,且当H小于10的时候可以表示成1位或者2位的形式)、M是分钟(0 ≤ M < 60,且当M小于10的时候可以表示成1位或者2位)。

输出
每个测试数据输出一行,当是整点对时时,输出时区转换后的小时结果;当不是整点对时时,输出0。

样例输入
4
12:00
01:01
3:00
00:00

样例输出
24
0
15
12

#include <iostream>
#include <string>
#include <cstdlib>


using namespace std;


int main()
{
    int lines;
    string h;
    string m;
    cin >> lines;
    int hh;
    int mm;

    while(lines) {
        getline(cin, h, ':');
        getline(cin, m, '\n');

        hh = atoi(h.c_str());
        mm = atoi(m.c_str());

        if(mm) {
            cout << 0 << endl;
        }else {
            hh += 12;
            if(hh <= 24) {
                cout << hh << endl;
            }else {
                cout << hh - 24 << endl;
            }

        }

        --lines;

    }

    return 0;
}

#include <string>
#include <cstdlib>

using namespace std;

int main()
{
    int lines;
    cin >> lines;
    int hh;
    int mm;
    char delim;

    while(lines) {
        cin >> hh >> delim >> mm;
        if(mm) {
            cout << 0 << endl;
        }else {
            hh += 12;
            if(hh <= 24) {
                cout << hh << endl;
            }else {
                cout << hh - 24 << endl;
            }
        }
        --lines;
    }

    return 0;
}

E:C++Java

时间限制: 2000ms 内存限制: 65536kB

描述
在百度之星的贴吧里面,Java的爱好者和C++的爱好者总是能为这两种语言哪个更好争论上几个小时。Java的爱好者会说他们的程序更加整洁且不易出错。C++的爱好者则会嘲笑Java程序很慢而且代码很长。
另一个Java和C++爱好者不能达成一致的争论点就是命名问题。在Java中一个多个单词构成的变量名应该按照如下格式命名:第一个单词的开头用小写字母,其余单词都以大写字母开头,单词与单词之间不加分隔符,除单词的首字母之外的字母一律使用小写。例如:javaIdentifier, longAndMnemonicIdentifier, name, bAIDU.
与Java不同C++的命名全都使用小写字母,在单词和单词之间使用“_”来作为分隔符。例如:c_identifier,long_and_mnemonic_identifier, name (当名字中只有一个单词的时候,Java与C++的命名是相同的), b_a_i_d_u.
你的任务就是写一个程序能让C++和Java程序相互转化。当然转换完成的程序中的变量名也要符合其语言的命名规则,否则的话是不会有人喜欢你的转换器的。
首先你要做的就是写一个变量名转换器。给出一个变量名,你要先检测是Java的还是C++的,然后把它转化为另一种命名格式。如果两种都不是,那么你的程序就要报错。转换过程必须保持原有的单词顺序,只能改变字母的大小写和增加或删除下划线。

输入
输入有且仅有一行,是一个变量名,其中包含字母和下划线,长度不超过100。

输出
如果输入的是Java变量名那么输出它对应的C++形式。如果是C++的则输出对应的Java的形式。如果两种都不是就输出“Error!”。

样例输入
输入样例1:
long_and_mnemonic_identifier
输入样例2:
anotherExample
输入样例3:
i
输入样例4:
bad_Style

样例输出
输出样例1:
longAndMnemonicIdentifier
输出样例2:
another_example
输出样例3:
i
输出样例4:
Error!

#include <iostream>
#include <string>
#include <cctype>


using namespace std;


bool isJava(const string &s);
bool isCpp(const string &s);

string java2cpp(const string & s);
string cpp2java(const string & s);

int main()
{
   string s;
   
   cin >> s;

   if(isJava(s) && isCpp(s)) {
        cout << s << endl;
   }else if(!isJava(s) && !isCpp(s)) {
        cout << "Error!" << endl;
   }else if(isJava(s)) {
        cout << java2cpp(s) << endl;
   }else if(isCpp(s)) {
        cout << cpp2java(s) << endl;
   }
   
    return 0;
}


bool isJava(const string & s) {
   int size = s.size();

   if(isupper(s[0])) return false;
   for(int i = 0; i < size; ++i) {
        if(!isalpha(s[i])) return false;
   }

   return true;
}

bool isCpp(const string & s) {
   int size = s.size();

   if(s[0]=='_') return false;
   for(int i = 0; i < size; ++i) {
        if(s[i] == '_' ) {
            ++i;
            if( !(isalpha(s[i]) && islower(s[i])) ) return false;
        }
        
        if(ispunct(s[i]) && s[i] != '_') {
            return false;
        }else if( !isalpha(s[i]) || isupper(s[i]) ) {
            return false;
        }
   }

   return true;
}




string java2cpp(const string &s){
    int len = s.size();
    char c;
    string tmp;
    
    for(int i = 0; i < len; ++i) {
        c = s[i];
        if(isupper(c)) {
            c = tolower(c);
            tmp += '_';
        }
        tmp += c;
    }

    return tmp;
}


string cpp2java(const string & s){
    int len = s.size();
    char c;
    string tmp;
    
    for(int i = 0; i < len; ++i) {
        c = s[i];
        if(ispunct(c)) {
            c = s[++i];
            if(islower(c)) {
                c = toupper(c);
            }
        }


        tmp += c;
    }

    return tmp;
}

F:百科蝌蚪团

时间限制: 1000ms 内存限制: 65536kB

描述
百度百科有一支神奇的队伍,他们叫自己“百科蝌蚪团”。为了更好的让蝌蚪团的成员们安排工作,百度百科的运营团队定出了一个24小时制的时间表。例如:
1. 每个蝌蚪团成员工作时长相同;
2. 必须安排蝌蚪团成员在他们方便的时间段工作;
3. 蝌蚪团成员安排时间最小安排时间节点(开始工作或停止工作)为半小时,比如04:00或04:30,而不是04:15;
4. 蝌蚪团成员一天在百度百科工作的时间是有上限的,他们会根据自己的情况给出上限。
5. 在特定时间段内必须有一定数量的蝌蚪团成员工作,以保证百度百科不断的进步
请帮运营团队计算一下,能保持24小时稳定在岗的蝌蚪团最少成员的数量。如果有2个蝌蚪团成员工作结束,同时另2个蝌蚪团成员开始工作,这段时间都算有2各成员稳定在岗。

输入
输入有多组,每组测试数据以一个整数N开头(1 ≤ N ≤ 50),表示蝌蚪团的成员数。紧接着,我们会有N个数据块,每一个数据块对应了一名蝌蚪团成员的日程情况。
每个数据块以两个整数开始,分别为K(1 ≤ K ≤ 50)和M(1 ≤ M ≤ 1440),用空格隔开。K表示这个数据块对应蝌蚪团成员方便的时间段的数量,M表示这个成员愿意每天在百度百科工作的最长分钟数。接下去的K行中,每行包括两个时间,分别表示成“HH:MM”的格式,以空格分隔,分别对应了该蝌蚪团成员一个方便的时间段的开始时间、结束时间;例如09:00 10:00表明他在早上九点到十点的时间段是方便的,可以在百度百科工作。如果两个时间相同,则说明这个他全天都是方便的。
最后一组数据的N为0,表示输入结束。

输出
对于每组数据,输出为一个整数,占一行。表示能保持24小时稳定在岗的蝌蚪团最少成员的数量。

样例输入
5
1 720
18:00 12:00
1 1080
00:00 23:00
1 1080
00:00 20:00
1 1050
06:00 00:00
1 360
18:00 00:00
3
1 540
00:00 00:00
3 480
08:00 10:00
09:00 12:00
13:00 19:00
1 420
17:00 00:00
3
1 1440
00:00 00:00
1 720
00:00 12:15
1 720
12:05 00:15
0

样例输出
2
1
1


一个不正确的答案: 明白 贪心!=最优。 部分有效。

#include <iostream>
#include <vector>
#include <list>
#include <set>
#include <map>
#include <iterator>
#include <cassert>

using namespace std;

typedef struct {
    unsigned int b;
    unsigned int e;
} range_t;

static void showMap(map<unsigned int, unsigned int> &map_count);
bool isRangeIntersection(range_t &a, range_t &b);
void rangeUnion(range_t &a, range_t &b, range_t &c);
void getRangeList(unsigned int bhh, unsigned int bmm, unsigned int ehh, unsigned int emm, list<range_t> &list);
void shrinkRangeList(list<range_t> &list_r, list<range_t> &result);
void showRangeList(list<range_t> &range_list);
void rangeList2set(list<range_t> &result, set<unsigned int> &s );
void mapCount(set<unsigned int> &s, map<unsigned int, unsigned int> &map_count);
void optimalAssignment(map<unsigned int, unsigned int> &map_count, vector<set<unsigned int> > &sets, vector<unsigned int> &vec_max );
unsigned  getMinInMap(map<unsigned int, unsigned int> &map_count);

int main()
{
    unsigned int n;
    unsigned int k;
    unsigned int m;

    unsigned int bhh;
    unsigned int bmm;
    char delim;
    unsigned int ehh;
    unsigned int emm;

    cin >> n;
    while(n) {
         vector<set<unsigned int> > sets(n);    // 所有成员工作时间段的集合的列表
         vector<unsigned int> vec_max(n);       // 所有成员工作的时间段最大数目
         map<unsigned int, unsigned int> map_count;       // 统计的这个各个时间段的可以工作的员工的数目
         for(unsigned int i=0; i<48; i++) map_count[i] = 0;

         for(unsigned int i=0; i<n; ++i) {
            cin >> k >> m;
            m /= 30;
            vec_max.push_back(m); //该员工的最大的工作的时间段数

            //生成单个成员的工作段集合
            set<unsigned int> s;
            list<range_t> range_list;
            list<range_t> result;
            for(unsigned int j=0; j<k; ++j) {
                 cin >> bhh >> delim >> bmm >> ehh >> delim >> emm;
                 getRangeList(bhh, bmm, ehh, emm, range_list);
            }
             //showRangeList(range_list);
             shrinkRangeList(range_list, result);
             //cout << " after shrink: " << endl;
             //showRangeList(result);
             rangeList2set(result, s);
             mapCount(s, map_count);
             sets.push_back(s);
         }
        optimalAssignment(map_count, sets, vec_max);
         //showMap(map_count);
        unsigned min = getMinInMap(map_count);
        cout << min << endl;

        cin >> n;
    }


    return 0;
}

void getRangeList(unsigned int bhh, unsigned int bmm, unsigned int ehh, unsigned int emm, list<range_t> &range_list) {
      unsigned int b = bhh*60 + bmm;
      unsigned int e = ehh*60 + emm;

      if(b>e) {
          range_t r;
          r.b = b;
          r.e = 24*60;
          range_list.push_back(r);

        if(e) {
          r.b = 0;
          r.e = e;
          range_list.push_front(r);
        }
      }else if(b == e) {
         range_t r;
         r.b = 0;
         r.e = 24*60;
         range_list.clear();
         range_list.push_back(r);

      }else if(b < e) {
          range_t r;
          r.b = b;
          r.e = e;
          range_list.push_back(r);
      }
}
void showMap(map<unsigned int, unsigned int> &map_count) {
    typedef map<unsigned int, unsigned int>::const_iterator map_it;

    for(map_it it=map_count.begin(); it!=map_count.end(); ++it ){
        cout << it->second << " ";
    }
    cout << endl;

}


bool isRangeIntersection(range_t &a, range_t &b){
    return !(a.e<b.b  || a.b > b.e);
}

void rangeUnion(range_t &a, range_t &b, range_t &c) {
    if(a.b>=b.b && a.e <= b.e){
        c.b = b.b;
        c.e = b.e;
    }else if(a.b<=b.b && a.e >= b.e) {
        c.b  = a.b;
        c.e =  a.e;
    }else if(a.b>=b.b && a.e >= b.e) {
        c.b = b.b;
        c.e = a.e;
    }else if(a.b<=b.b && a.e<=b.e) {
        c.b = a.b;
        c.e = b.e;
    }else if(a.e == b.b) {
        c.b = a.b;
        c.e = b.e;
    }else if(b.e == a.b) {
        c.b = b.b;
        c.e = a.e;
    }else if(a.b == b.b && a.e == b.e) {
        c.b = a.b;
        c.e = a.e;
    }

}


void shrinkRangeList(list<range_t> &range_list, list<range_t> &result) {
    while(!range_list.empty()) {
        range_t tmp = range_list.back();
        range_list.pop_back();
        int tag = 0;
        if(!range_list.empty()){
            typedef list<range_t>::iterator list_it;
            for(list_it it=range_list.begin(); it!=range_list.end(); ++it) {
                if(isRangeIntersection(*it, tmp)) {
                    tag = 1;
                    range_t c;
                    rangeUnion(*it, tmp, c);
                    range_list.erase(it);
                    range_list.push_back(c);
                    break;
                }
            }
            if(tag) continue;
            result.push_back(tmp);
        }else{
            result.push_back(tmp);
        }
    }
}

void showRangeList(list<range_t> &range_list) {
    typedef list<range_t>::iterator list_it;

    for(list_it it=range_list.begin(); it!=range_list.end(); ++it) {
        cout << "["  << it->b << ", " << it->e << "]  ";
    }
    cout<<endl;
}

void rangeList2set(list<range_t> &result, set<unsigned int> &s ) {
    unsigned int bhh;
    unsigned int bmm;
    unsigned int ehh;
    unsigned int emm;
    typedef list<range_t>::iterator list_it;

    for(list_it it= result.begin(); it!= result.end(); ++it) {
        bhh = it->b /60;
        bmm = it->b - bhh*60;

        ehh = it->e / 60;
        emm = it->e  - ehh*60;

        bhh *= 2;
        if(bmm) {
           if(bmm<=30) {
               bmm = 1;
           }else {
             bmm = 2;
           }
        }
        bhh += bmm;

        ehh *= 2;
        if(emm) {
            if(emm<30) {
                emm = 0;
            }else if(emm >= 30){
                 emm = 1;
            }
        }
        ehh += emm;
        for(unsigned int t=bhh; t<ehh; ++t) {
            s.insert(t);
        }
    }
}

void mapCount(set<unsigned int> &s, map<unsigned int, unsigned int> &map_count) {
    typedef set<unsigned int>::const_iterator set_it;

    for(set_it it=s.begin(); it!= s.end(); ++it ) {
        map_count[*it]++;
    }
}


void optimalAssignment(map<unsigned int, unsigned int> &map_count, vector<set<unsigned int> > &sets, vector<unsigned int> &vec_max ) {
     typedef vector<set<unsigned int> >::iterator sets_iter;
     typedef set<unsigned int>::iterator  set_iter;
     vector<unsigned int>::const_iterator large_it = vec_max.begin();

     for(sets_iter it=sets.begin(); it!=sets.end(); ++it) {
        while(it->size() > *large_it) {
            set_iter max_it;
            unsigned int max_max = 0;
            for(set_iter i = it->begin(); i!= it->end(); ++i) {
              if(map_count[*i]>max_max) {
                max_it = i;
                max_max = map_count[*i];
              }
            }
            map_count[*max_it]--;
            it->erase(max_it);
        }
        ++large_it;
     }

}


unsigned  getMinInMap(map<unsigned int, unsigned int> &map_count) {
    unsigned int min = 0xffffffff;
    typedef map<unsigned int, unsigned int>::const_iterator map_it;

    for(map_it it=map_count.begin(); it!=map_count.end(); ++it ){
        if(it->second < min) min = it->second;
    }

    return min;
}

G:聊天就是Repeat

时间限制: 1000ms 内存限制: 65536kB

描述
百度Hi作为百度旗下的即时聊天工具,在百度公司内部很是流行。要实现这样的一个聊天工具,最重要的问题就是要能保证我发出的内容能原封不动的在接收同学那里显示出来。今天,就给你一个机会,让你模拟一下百度Hi传递信息的过程,把我发给Robin的聊天内容原封不动的输出出来。

输入
输入的聊天内容数据有多组,每组数据占一行。

输出
与输入聊天内容完全相同的内容。请注意每组数据中的空格也要原封不动的被传过去噢~

样例输入
Hello Robin

样例输出
Hello Robin

#include <iostream>


using namespace std;

int main()
{
   char ch;

   while(cin.get(ch)) {
        cout.put(ch);
   }


    return 0;
}
其他方案:

#include <iostream>
#include <iterator>
#include <algorithm>

#include <cstdio>



using namespace std;

int main()
{
 /*
   istream_iterator<string> in_begin(cin);
   istream_iterator<string> in_end;
   ostream_iterator<string, char> out(cout, " ");

   copy(in_begin, in_end,  out);
*/

/*****原样输出****/

    char ch;
    while(cin.get(ch)) {
        cout.put(ch);
    }

 /*
    int ch;
    while((ch=getchar()) != EOF) {
        putchar(ch);
    }
 */

  /*
    int ch;
    while((ch=getc(stdin)) != EOF) {
        putc(ch, stdout);
    }
   */

/*
   int ch;
   while((ch=fgetchar()) != EOF ) {
        fputchar(ch);
   }
*/

   /*
    int ch;
    while((ch=fgetc(stdin)) != EOF) {
        fputc(ch, stdout);
    }
   */



    return 0;
}

H:用户请求中的品牌

时间限制: 1000ms 内存限制: 65536kB

描述
馅饼同学是一个在百度工作,做用户请求(query)分析的同学,他在用户请求中经常会遇到一些很奇葩的词汇。在比方说“johnsonjohnson”、“duckduck”,这些词汇虽然看起来是一些词汇的单纯重复,但是往往都是一些特殊品牌的词汇,不能被拆分开。为了侦测出这种词的存在,你今天需要完成我给出的这个任务——“找出用户请求中循环节最多的子串”。

输入
输入数据包括多组,每组为一个全部由小写字母组成的不含空格的用户请求(字符串),占一行。用户请求的长度不大于100,000。
最后一行输入为#,作为结束的标志。

输出
对于每组输入,先输出这个组的编号(第n组就是输出“Case n:”);然后输出这组用户请求中循环节最多的子串。如果一个用户请求中有两个循环节数相同的子串,请选择那个字典序最小的。

样例输入
ilovejohnsonjohnsonverymuch
duckduckgo
aaabbbcccisagoodcompany
#

样例输出
Case 1: johnsonjohnson
Case 2: duckduck
Case 3: aaa

#include <iostream>
#include <string>
#include <vector>

using namespace std;

pair<int, string> getMaxCyclicSubString(const string & str);

int main(int argc, char *argv[]) {
    string str;
    int count = 0;
    pair<int, string> result;
    
    cin >> str;
    while(str[0] != '#') {
        result = getMaxCyclicSubString(str);
        cout << "Case " << ++count << ":";
        for(int i = 0; i < result.first; ++i) {
          cout << result.second ;
        }
        cout << endl;

        cin >> str;
    }


    return 0;
}

pair<int, string> getMaxCyclicSubString(const string &str) {
    vector<string> substrs;
    string substr = str.substr(0, 1);
    int max_count = 1;
    int count = 1;

    int len = str.length();
    for(int i = 0; i < len; ++i) {
        substrs.push_back(str.substr(i, len-i)); //取子串
       //cout << str.substr(i, len-i) << endl;
    }

    for(int i = 0; i < len; ++i) {
        
        for(int j = i + 1; j < len; ++j) {
            int sub_len = j - i;  //确定循环节的长度
            count = 1;
            if(substrs[i].substr(0, sub_len) == substrs[j].substr(0, sub_len) ) { //存在循环节
                ++count;
                for(int k = j + sub_len; k < len; k += sub_len) { //更多的循环节
                    if(substrs[i].substr(0, sub_len) == substrs[k].substr(0, sub_len)) {
                        ++count;
                    }else {
                        break;
                    }
                }
                //cout <<  "count = " << count << endl;


                if(count >= max_count) {
                    string cur_substr = substrs[i].substr(0, sub_len);
                    if(count == max_count) {
                        if(cur_substr < substr){ 
                            substr = cur_substr; 
                        }
                    }else {
                        max_count = count;
                        substr = cur_substr;
                    }
                }
            }
        }


        if(1 == max_count) {
            string cur_substr = substrs[i].substr(0, 1);
            if(cur_substr < substr ) {
                substr = cur_substr;
            }
        }



    }

    return make_pair(max_count, substr);

}

c语言实现:

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

#define MAX_LEN  100000

void getMaxCyclicSubString(const char *str, const char **substr, int *substr_len, int *max_count);

char str[MAX_LEN];

int main(int argc, char *argv[]) {
    char *substr;
    int substr_len;
    int  max_count;
    int i;
    int j;
    int line = 0;


    scanf("%s", str);
    while(str[0] != '#') {
        getMaxCyclicSubString(str, &substr, &substr_len, &max_count);
        printf("%s %d: ", "Case", ++line);
        for(i = 0; i < max_count; ++i) {
          for(j=0; j < substr_len; ++j){
            printf("%c", substr[j]);
          }
        }
        printf("\n");

        scanf("%s", str);
    }

   return 0;
}

void getMaxCyclicSubString(const char *str, const char **substr, int *substr_len, int *max_count) {
    int i;
    int j;
    int k;
    int count = 1;
    int sub_len = 1;

    *substr = str;
    *substr_len = 1;
    *max_count = 1;

    int len = strlen(str);
    for(i = 0; i < len; ++i) {
        for(j = i + 1; j < len; ++j) {
          sub_len = j - i; //循环节的长度
          count = 1;       //长度为sub_len的循环节的初始计数
          if(j + sub_len -1 < len && !strncmp(str + i, str + j, sub_len)) {
            ++count; //循环节出现第二次
            for(k = j + sub_len; k < len; k += sub_len) { //测试循环节是否接着出现
                if(k + sub_len - 1 < len && !strncmp(str + i, str + k, sub_len)) {
                    ++count;
                }else {
                    break;
                }
            }

            //更新出现次数最多的循环节
            if(*max_count < count) {
               *substr = str + i;
               *max_count = count;
               *substr_len = sub_len;
            }

            //循环节出现次数相同时,保留字典序较小的循环节
            if(*max_count == count){
                if(sub_len < *substr_len) {
                    if(strncmp(str + i, *substr, sub_len) <= 0) {
                        *substr = str + i;
                        *substr_len = sub_len;
                    }
                }else {
                    if(strncmp(str + i, *substr, *substr_len) < 0) {
                        *substr = str + i;
                        *substr_len = sub_len;
                    }
                }

            }


          }
        }

        //循环节都只出现一次
        if(1 == *max_count){
            if(str[i] < **substr) {
                *substr = str + i;
            }
        }
    }


}



I:地图的省钱计划

时间限制: 1000ms 内存限制: 65536kB

描述
百度地图有自己的一套坐标系(你可以把它看作一个笛卡尔坐标系),在这套坐标系里,一个标准单位为1km。而在这坐标系上针对地理信息进行标注的数据,大多数时候是通过购买的方式完成的。为了节约数据更新的成本,数据组里的鑫哥想出了一个好主意——自己测数据。
鑫哥按照他的预想开始实验;在每组试验中,鑫哥选取了三个已经被准确标注在百度地图的坐标系里的移动运营商的基站作为信号接收点(这里可以准确的得到信号的接收时间信息)。当信号接收点附近的用户手机签到时,三个信号接收点就会先后接收到这个信号,并可以准确的知晓接收到信号的时间(将第一个信号点接收到信号的时间记为0秒时刻)。由此,我们就可以确定用户手机签到的位置的在地图的准确坐标了。
现在已知以下数据:
1.三个信号接收点在百度地图坐标系中的具体坐标(x1,y1), (x2,y2), (x3,y3);
2.三个信号点得到用户发出的信号的时间t1, t2, t3(t1,t2, t3 ≥ 0),单位s; t1, t2, t3至少有一个数为0;
3.信号的转播速度C,单位m/s;
请帮助鑫哥写个程序,计算下用户发出信号的位置在百度地图坐标系内的坐标(这个点是唯一的)。

输入
输入包含多组数据,每组数据格式如下:
C
x1 y1 x2 y2 x3 y3
t1 t2 t3
最后一组数据为0,表示输入结束。

输出
针对每组测试数据,请先输出这个组的编号(第n组就是输出“Case n:”);然后换行输出信号发出点的坐标(x,y) 。x,y应该由空格分隔,并被舍入到小数点后第六位。

样例输入
1000
0 1 1 1 2 1
0 0.6 1.6
1000
0 0 0 1 1 0
0.4142135 0 0
1000
0 0 1 0 2 1
0 0.414213562373 1
1000
0 0 0 -1 0 1
0 0 1
1000
0 0 0 1 0 -1
0 1 0
1000
0 0 1 0 -1 0
0 1 0
1000
0 0 -1 0 1 0
0 0 1
100
0 0 0 1 1 0
0 10 10
0

样例输出
Case 1:
0.200000 1.000000
Case 2:
1.000000 1.000000
Case 3:
0.000000 1.000000
Case 4:
0.000000 -0.500000
Case 5:
0.000000 -0.500000
Case 6:
-0.500000 0.000000
Case 7:
-0.500000 0.000000
Case 8:
0.000000 0.000000

 不会做!

J:百度的新大厦

时间限制: 1000ms 内存限制: 65536kB

描述
继百度搜索框大厦之后,百度又于2012年初在深圳奠基了新的百度国际大厦,作为未来百度国际化的桥头堡。不同于百度在北京的搜索框大厦,新的百度国际大厦是一栋高楼,有非常多的楼层,让每个楼中的电梯都能到达所有楼层将是一个极为不明智的设计。因此,设计师给出了一个特别的设计——一共大厦有m个电梯,每个电梯只有两个按钮,(针对第i个电梯)两个按钮分别可以使电梯向上或ui层向下一定di层;百度国际大厦很高,你永远到不了顶层,也就是说电梯没有上限,但是,电梯不可以钻入地下,也就是说是有下限的。我们将每层楼用整数标记,为了体现IT公司的特质,我们以0作为地面这一层的标记。
如果你某天在百度国际大厦的0层,仅可以选择m个电梯中的一个乘坐(不可以中途换电梯),请你计算,你按电梯中的按钮n次后(每次两个按钮选一个按),可以到达的最低楼层数。

输入
输入的第一行包括两个整数,分别为n和m(1 ≤ n ≤ 1,000,000,1 ≤ m ≤ 2,000),表示按电梯按钮的次数和大厦中的电梯数量。接下去的m行,每行包括2个由空格分割的数字,分别表示了提供的m个电梯中的某一个的上行按钮上升一次的层数ui和下行按钮下降一次的层数di(1 ≤ ui,di ≤ 1000)

输出
输出一个正整数,表示选用m个电梯中的一个后,在电梯里按电梯中的按钮n次后(每次两个按钮选一个按),可以到达的最低楼层数。

样例输入
10 3
15 4
15 12
7 12

样例输出
13

提示
按钮上的移动楼层数无法改变,比方说从8层向下9层是不可行的

#include <iostream>

using namespace std;

unsigned int gcd(unsigned int a, unsigned int b);


int main()
{
    unsigned int  n;
    unsigned int m;
    unsigned int up;
    unsigned int down;
    unsigned int level = 0;
    unsigned int min = 0xffffffff;
    unsigned int lcm;
    int t;
    int d;

    cin >> n >> m;

    while(m) {
        cin >> up >> down;
        lcm = up * down / gcd(up, down);
        d = lcm/up + lcm/down;
        t = n % d;
        if(t==0) t = d;

        level = 0;
        while(t) {
           if(level <= down) {
                level += up;
           }else {
                level -= down;
           }
           --t;
        }

        if(level<min) min = level;
        --m;
    }

    cout << min << endl;

    return 0;
}

unsigned int gcd(unsigned int a, unsigned int b) {
    unsigned int r;

    while(b) {
        r = a % b;
        a=b;
        b=r;
    }

    return a;

}




总结: 本次参赛说明一个问题,你的语言掌握的再好,编程风格、模式、方法再好, 不精通算法也是枉然。算法导论,活学活用!学无止境! 











 类似资料: