2018大华软件大赛 初赛

1    
给定一个正数数组,找出不相邻元素的子序列的和的最大值。如:2、5、3、9应该返回14(5+9);8、5、3、9、1应该返回17(8+9);5 4 10 100 10 5应该返回110(5+100+5);    "输入的第一行指定用例数量T;
用例的第一行输入指定数组长度N;
用例的第二行输入指定N个数组元素C[i];"    输出子序列的和的最大值    "1 ≤ T ≤ 10
1 ≤ N ≤ 100
0 ≤ C[i] ≤ 500"    "int find_max_sum_without_adjacents(int vec[],int N)
Input:
2
6
5 4 10 100 10 5
4
3 2 7 10

Output:
110
13"

 #include<bits/stdc++.h>
 using namespace std;
 #define LOACL  freopen("in","r",stdin);\
          freopen("out","w",stdout);
 #define FASTIO  ios::sync_with_stdio(false);
 #define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

 const int   inf = 987654321;
 const int    sz = (int)1e6 + 5;
 const int   mod = (int)1e9 + 7;
 const int sqrtn = 300; 

 //#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
 #define CLR(arr,val) memset(arr,val,sizeof(arr))
 #define DBG(x) cout<<(#x)<<"="<<x<<endl
 #define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
 #define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

 #define FOR(i, a, b)  for(int i=(a); i<(b); i++)
 #define REP(i, a, b)  for(int i=(a); i<=(b); i++)
 #define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

 #define all(x) x.begin(),x.end()
 #define low(x) (x)&(-x)
 #define pb push_back
 typedef long long ll;
 typedef double dl;
 int t,n,a[sz];
void ff()
{
    if(n<=0)cout<<0<<endl;
    else if(n==1) cout<<a[1]<<endl;
    int excl =0,incl =a[1];
    int excl_new;

    REP(i,2,n)
    {

        excl_new = (excl>incl)?excl:incl;
        incl = excl +a[i];
        excl = excl_new;
    } 

    cout<<(incl>excl?incl:excl)<<endl;

}

 int main()
 {
     LOACL
     cin>>t;
     while(t--)
     {
         cin>>n;
         REP(i,1,n)cin>>a[i];
         ff();
     }

     return 0;
 }

2    
"给定一个链表,实现一个函数,将链表中每k个节点进行翻转,若最后一组节点数量不足k个,则按实际个数翻转。例如:给定链表1->2->3->4->5->6->7->8->NULL,k=3,翻转后输出3->2->1->6->5->4->8->7->NULL。
翻转函数reverse有两个参数,分别为链表头指针和翻转步长k。"    "输入的第一行指定用例数量T;
用例的第一行输入指定链表节点个数N;
用例的第二行输入指定N个节点数值,使用空格隔开;
用例的第三行输入指定翻转步长K;"    按照K翻转后的链表节点值    "1<=T<=10
1<=N<=100
1<=K<=N"    "
Input:
1
8
1 2 2 4 5 6 7 8
4

Output:
4 2 2 1 8 7 6 5"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
int t,n,a[sz],k;
stack<int>s;

int main()
{
  //  LOACL
    cin>>t;
       while(t--)
       {
           cin>>n;
           REP(i,1,n)cin>>a[i];
           cin>>k;

        REP(i,1,n)
        {
            if(s.size()==k)
            {
                while(!s.empty())
                {
                    cout<<s.top()<<" ";
                    s.pop();
                }
            }
            s.push(a[i]);
        }
        while(!s.empty())
        {
            cout<<s.top()<<" ";
            s.pop();
        }
        cout<<endl;
       }

    return 0;
}

3    
"输入一个由大写字母‘A-Z’组成的字符串,按照如下方式,对字符串中的字符进行编码:
1.统计每个字符出现的次数,并根据出现次数对字符进行权重分配;
 a.出现次数越高,权重越大;
 b.出现次数相同,字符值越小,权重越大;
 c.权重值为1~26,必须从1开始,连续分配,数值越大,权重越高;
2.把权重最小的两个字符构成二叉树的左右子节点,其和作为根节点(节点值为字符权重);
 a.若两个子节点值不等,较小值作为左子节点;
 b.若两个子节点值相同(多字符的权重和与另一个字符权重可能相同),则叶子节点作为左子节点;
3.重复过程2,直到根节点值为所有字符的权重和;
4.将树的左边定位0,右边定位1,从根节点到字符节点的路径,即为其编码值;

示例:
1.输入字符串‘MBCEMAMCBA’,各字符出现次数分别为M:3,A:2,B:2,C:2,E:1;
2.根据字符出现次数和字符大小,进行排序,结果为:M>A>B>C>E,对应权重值为 M:5,A:4,B:3,C:2,E:1
3.根据规则生成权重树:
 a.(M:5,A:4,B:3,C:2,E:1)中E:1和C:2值最小,相加得3,则E:1为左节点,C:2为右节点,3为根节点;
 b.(M:5,A:4,B:3,3)中B:3和3值最小,相加得6,则B:3为左节点,3为右节点,6为根节点;
 c.(M:5,A:4,6)中M:5和A:4值最小,相加得9,则A:4为左节点,M:5为右节点,9为根节点;
 d.(6,9)中只有两个值,相加得15,则6为左节点,9为右节点,15为根节点;
 e.根节点达到所有字符的权重和1+2+3+4+5=15,结果如下:
         15
    0/      1\
    6         9
  0/ 1\     0/ 1\
  B:3  3   A:4  M:5
     0/ 1\
    E:1  C:2"    "输入的第一行指定用例数量T;
用例的第一行输入为原始字符串;"    经过编码后的二进制字符串(使用字符‘0‘和‘1‘表示比特位0和1)    "1 ≤ T ≤ 10
字符串长度小于等于100"    "// 参数:raw_str     输入字符串
// 参数:encoded_str 编码后的字符串
void str_encoding(const std::string& raw_str, std::string& encoded_str)

Input:
1
MBCEMAMCBA

Output:
11000110101110110110010"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300;

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
int t;
char a[sz];
typedef struct node
{
    char data;
    struct node * l,* r;
}TreeNode,*Treet;
int n =0 ;
#if  0
void createTree (Treet & root,char * a)
{

    char c;
    c = a[n]; n++;
    if(‘#‘ == c)  root = NULL;
    else
    {
        if(root == NULL) return;
        else
        {
            root =new TreeNode;
            root->data=c;
            createTree(root->l,a);
            createTree(root->r,a);
        }
    }
}
#endif
void createTree (Treet & root)
{
    char ch;
    cin>>ch;

//    DBG(ch);
    if(‘#‘==ch) root = NULL;
    else
    {
            root=new TreeNode;
            root->data =ch;
            createTree(root->l);
            createTree(root->r);
    }
//1
//524###36##8##
}
void pT(Treet root)
{
    if(root ==NULL) return ;
    cout<<root->data ;
    if(root->r)
        pT(root->r);
}
void freeTree(Treet   root)
{
    if(root==NULL) return ;
    freeTree(root->l);
    freeTree(root->r);
    delete root;
    //root = NULL;
}
void preTrave(Treet root)
{
    if(root ==NULL) return ;
    cout<<root->data ;
    preTrave(root->l);
    preTrave (root->r);
}
int main()
{
   //   LOACL
    cin>>t;
    while(t--)
    {
    //     cin>>a;
    //     n=0;
          Treet root;
         createTree( root );

         pT( root);     cout<<endl;
         freeTree(root);
    }

    return 0;
}

4    
"实现find_sub_string(str1,str2)函数,判断字符串str2在str1中出现的次数。返回str2在str1中出现的次数。
int find_sub_string(const std::string& str1, const string& str2);"    "输入的第一行指定用例数量T;
用例的第一行输入str1;
用例的第二行输入str2;"    回str2在str1中出现的次数。    "1 ≤ T ≤ 10
str1和str2非空且小于100个字符"    "int find_sub_string(const std::string& str1, const string& str2);

Input:
3
abcdefg
bcd
abcdcdc
cdc
aaaaa
aaa

Output:
1
2
3"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
char src[150],des[150];
int t,srclen,deslen;

int main()
{
   // LOACL
    cin>>t;
    while(t--)
    {
        cin>>src>>des;
        srclen=strlen(src);
        deslen=strlen(des);
        int ans =0 ;
        REP(i,0,srclen-1)
        {

            bool flag =true;
            REP(j,0,deslen-1)
            {
                if(src[i+j]!=des[j])
                    {
                        flag=false;
                        break;
                    }
            }
            if(flag) ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

5    
"有一个吃金币游戏:
1.地图中有N个城堡(编号分别为0~N-1),每个城堡中挂着一面旗子;
2.某些城堡之间是连通的,在其连通的路上,分散着若干个金币(个数可能相同,也可能不同);
3.玩家走过存在金币的路之后,可以获得这条路上的所有金币,同一条路走多次,只有第一次可获得金币;

游戏规则:
1.玩家可以从任意一个城堡出发;
2.玩家必须拿到所有城堡的旗子;
3.玩家走过的所有路,不能存在环路;
4.一定存在至少一条能让玩家拿到所有旗子的路线;

请设计一个算法,计算在遵守以上游戏规则的的前提下,最多能获取到的金币个数。

补充规则中对环路的说明:
1、环路就是最终走过的路径中存在圈,实例如下:
非环路:                  环路:1-2-5-4-1则成为环路
1----2    3              1----2----3
       |      |                |    |
       |      |                |    |
4----5----6              4----5----6
|      |       |              |    |
|      |      |               |    |
7    8    9              7    8----9

2、如说明1中的路径,玩家走1-2-5-4-7-4-5,虽然无圈,但是4-7、5-4中的路径金币只能吃一次,重复走第二次金币不可以获取"    "输入的第一行指定用例数量T;
用例的第一行输入指定城堡个数N;
用例的第二行输入指定城堡间连通的路的数量M;
用例的后续行输入指定城堡之间的金币数量,包括三个参数: 出发点城堡编号 目标城堡编号 金币数量,使用空格隔开;"    最多能获取到的金币个数    "N > 1
M >= N
保证所有城堡间存在连通道路
M<30"    "// 记录城堡间路上金币信息的结构体
// 从城堡castle_from到城堡castle_to的路上有coins个金币
struct road{
 int castle_from;
 int castle_to;   
 int coins;
};

// 计算最多能获取到的金币个数
// 参数:roads         路径和金币信息数组
// 参数:roads_count   roads数量
// 参数:castles_count 城堡个数
// 返回值:获取到的金币个数
int max_coin(const road roads[], int roads_count, int castles_count);

Input:
1
7
9
0 1 10
0 2 6
0 3 5
1 3 15
2 3 4
1 4 3
3 5 3
4 6 9
5 6 7

Output:
50"

借鉴队友大佬代码 (from [email protected](286838947))

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

struct road{
    int castle_from;
    int castle_to;
    int coins;
};

int coin_sum;
int num_walk_time;
int n_city;
void ff( vector<road> &road_in, vector<int>& city_use_in)
{
    int max_coin=0;
    int road_mark=0;
    int city_mark=0;
    for(int i =0;i<road_in.size();i++)
    {
        if(city_use_in[road_in[i].castle_to]==-1
           &&city_use_in[road_in[i].castle_from]>-1
                && road_in[i].coins > max_coin)
        {
            road_mark=i;
            max_coin=road_in[i].coins;
            city_mark=road_in[i].castle_from;
        }
        if(city_use_in[road_in[i].castle_from]==-1
           &&city_use_in[road_in[i].castle_to]>-1
           && road_in[i].coins > max_coin)
        {
            road_mark=i;
            max_coin=road_in[i].coins;
            city_mark=road_in[i].castle_to;
        }

    }
    city_use_in[city_mark]=-1;
    road_in[road_mark].coins=-1;
    coin_sum= coin_sum+max_coin;
    num_walk_time++;
    if(num_walk_time<n_city-1)
    {
        find_max_coin_road(road_in,city_use_in);
    }
    else
    {
        return;
    }

}

void init(vector<road> &road_sum, vector<int>& city_use_in)
{
    int max_coin=0;
    int road_mark;
    for(int i = 0;i<road_sum.size();i++)
    {
        if(max_coin<road_sum[i].coins)
        {
            max_coin=road_sum[i].coins;
            road_mark=i;
        }
    }
    city_use_in[road_sum[road_mark].castle_to]=-1;
    city_use_in[road_sum[road_mark].castle_from]=-1;
    road_sum[road_mark].coins=-1;
    coin_sum= coin_sum+max_coin;
}

int main() {
    int t;
    cin >> t;
    while (t--)
    {
        vector<int> v;
        coin_sum=0;
        num_walk_time=0;
        vector<road> cost;
        int n,m;
        cin >> n >> m;
        n_city=n;
        for(int i = 0;i<n;i++)
        {
            v.push_back(i);
        }
        for(int i = 0 ; i < m;i++)
        {
            road road_temp;
            cin >> road_temp.castle_from>>road_temp.castle_to>>road_temp.coins;
            cost.push_back(road_temp);
        }
        init(cost,v);
        ff(cost,v);
        cout << coin_sum;

    }
    return 0;
}

6    
"在H.264视频编码标准中,编码帧由NALU头和NALU主体组成,其中NALU头由一个字节组成。在实际编码时,在每个NAL前添加起始码 0x000001,解码器在码流中检测到起始码,当前NAL结束。
为了防止NAL内部出现0x000001的数据,在编码完一个NAL时,如果检测出有连续两个0x00字节,就在后面插入一个0x03。
当解码器在NAL内部检测到0x000003的数据,就把0x03抛弃,恢复原始数据。给定一组包含SPS NALU的编码数据,找出解码后的SPS数据。比如:
输入:{0x1f 0x00 0x00 0x01 0x67 0x42 0xd0 0x80 0x00 0x00 0x03 0x00 0x80 0x00 0x0f 0x00 0x00 0x01 0x68 0xce 0x3c 0x80},
处理:在上述例子中,第一个0x00 0x00 0x01为识别到的数据头,0x00 0x00 0x03 0x00数据中,0x03为需抛弃数据,第二个0x00 0x00 0x01为下一个数据头,那么取出两个数据头中间的数据并且抛弃掉此0x03,结果如下:
{0x67 0x42 0xd0 0x80 0x00 0x00 0x00 0x80 0x00 0x0f }。"    "输入的第一行指定用例的数量T;
用例的第一行输入指定二进制数据长度N;
用例的第二行输入指定N个二进制数据元素C[i];"    输出解码后的SPS数据    "7 ≤ N ≤ 50
0 ≤ C[i] ≤ 0xff"    "int find_sps_in_h264(unsigned char[],int N)
input:
1
23
0 0 01 67 42 c0 16 d0 80 0 0 03 0 80 0 0f 0 0 01 68 ce 3c 80
output:
67 42 c0 16 d0 80 0 0 0 80 0 0f"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;

int t,n,a[sz] ;

int main()
{
    //  LOACL
    scanf("%d",&t);
   // DBG(t);

    while(t--)
    {

        scanf("%d",&n);
        REP(i,1,n)  scanf("%x",&a[i]);
    //    REP(i,1,n)        printf("%02x %d \n",a[i],a[i]);

        int begin,end ;
        REP(i,1,n)
        {
            if(a[i]==0&&a[i+1]==0&&a[i+2]==1)
             {
                begin=i+3;
                break;
            }
        }
        REP(i,begin,n)
        {
            if(a[i]==0&&a[i+1]==0&&a[i+2]==1) end=i-1;
        }

    //      printf("begin,end %d %d \n",begin,end);
    //    if(a[begin]==0)printf("0");
    //    else printf("%02x",a[begin]);
        REP(i,begin,end)
        {
             if(a[i]==3)
            {
                if(a[i-1]==0&& a[i-2]==0)
                    continue;
            }
           printf("%x%c",a[i],i==end?‘\n‘:‘ ‘ );
        }

    } 

    return 0;
} 

7    
给定一个全小写的英文字符串,请在该字符串中找到一个连续子字符串,使得子字符串没有重复的字符并且长度最长,计算此最长字符串的长度。比如:abcbdeab,最长的子字符串为cbdea,长度为5;aaaa,最长子字串为a,长度为1。    "输入的第一行指定用例数量T;
用例的第一行输入小写字符串;"    输出最长不含重复字符的连续子字串的长度    1<=length of str<=100    "Input:
2
abcabcdabc
bbbb

Output:
4
1"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
class Solution {
public:

    int lengthOfLongestSubstring(string s) {
        // write your code here
        int ret = 0;
        map<char, int> m;
        int start = 1;
        for (int i = 1; i <= s.length(); i++)
        {
            char c = s[i - 1];
            if (m[c] >= start)
            {
                start = m[c] + 1;
                m[c] = i;

            }
            else
            {
                m[c] = i;
                ret = max(ret, i - start + 1);
            }

        }
        return ret;
    }
};

int main()
{
   // LOACL
    Solution s;
    int n;string str;
    cin>>n;
    while(n--)
    {
        cin>>str;
        cout<<s.lengthOfLongestSubstring(str)<<endl;
    }

    return 0;
}

8    
一个数可以用二进制表示,也可以用十进制表示,如果该数的二进制表示法所有位数字之和等于十进制表示法所有位数字之和,则称该数为神奇数。比如:21(十进制)=10101(二进制),所有位数之和为2+1=3,1+0+1+0+1=3。求小于等于M的神奇数有多少个。    "输入的第一行指定用例数量T;
用例的第一行输入数字M;"    输出神奇数字的个数    1<=M<=100000    "Input:
2
100
300

Output:
3
11"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
class Solution {
public:

    int lengthOfLongestSubstring(string s) {
        // write your code here
        int ret = 0;
        map<char, int> m;
        int start = 1;
        for (int i = 1; i <= s.length(); i++)
        {
            char c = s[i - 1];
            if (m[c] >= start)
            {
                start = m[c] + 1;
                m[c] = i;

            }
            else
            {
                m[c] = i;
                ret = max(ret, i - start + 1);
            }

        }
        return ret;
    }
};

int main()
{
   // LOACL
    Solution s;
    int n;string str;
    cin>>n;
    while(n--)
    {
        cin>>str;
        cout<<s.lengthOfLongestSubstring(str)<<endl;
    }

    return 0;
}

9    
我们来玩一个大富翁的游戏,在地图上有N个连续的城市,城市对某件商品的售价为[V1,V2,V3...VN],你作为未来的大富翁看到其中的商机,打起了倒卖商品赚取差价的主意。约束条件:你只能顺序从第一个城市出发,不能走回头路,每次只能交易一件商品,再下次买入商品后必须卖掉之前买入的商品,求你能赚取的最大财富。比如:城市商品售价为[1,9,2,3,8],最大财富为(9-1)+(8-2)=14;城市商品售价为[9,8,3,2,1],最大财富为0,因为你买啥都无法赚钱。    "输入的第一行指定用例数量T;
用例的第一行输入城市的个数n;
用例的第一行输入商品售价,以空格隔开;"    输出赚取的最大财富值    "1<=n<=100
1<=v<=100"    "Input:
2
5
1 9 2 3 8
5
9 8 3 2 1

Output:
14
0"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
int t,n;
int a[200] ;

int main()
{
//   LOACL
    cin>>t;
    while(t--)
    {
        cin>>n;
        int ans =0;
        REP(i,1,n) cin>>a[i];
        REP(i,2,n) ans+=a[i]-a[i-1]>0?a[i]-a[i-1]:0;
        cout<<ans<<endl;
    }

    return 0;
}

10    
"假设你站在一棵二叉树的右边,从上往下,请输出你看到的节点。比如:
         5         <---
        / \
       2   3       <---
      /   / \
     4   6   8     <---
返回 538。"    "输入的第一行指定用例数量T;
用例的第一行输入二叉树(以先序序列的方式输入,比如题目的二叉树可以用""524###36##8##"");"    输出从上往下看到的节点序列    输入字符串长度<1000    "Input:
1
524###36##8##

Output:
538"

#include<bits/stdc++.h>
using namespace std;
#define LOACL  freopen("in","r",stdin);\
         freopen("out","w",stdout);
#define FASTIO  ios::sync_with_stdio(false);
#define CLOCK cout<<1.*clock()/CLOCKS_PER_SEC<<"ms"<<"\n";

const int   inf = 987654321;
const int    sz = (int)1e6 + 5;
const int   mod = (int)1e9 + 7;
const int sqrtn = 300; 

//#define add(u,v,w) (e[++tot]=(edge){v,head[u],1},head[u]=tot;)
#define CLR(arr,val) memset(arr,val,sizeof(arr))
#define DBG(x) cout<<(#x)<<"="<<x<<endl
#define DBG2(x,y) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<endl
#define DBG3(x,y,z) cout<<(#x)<<"="<<x<<"\t"<<(#y)<<"="<<y<<"\t"<<(#z)<<"="<<z<<endl

#define FOR(i, a, b)  for(int i=(a); i<(b); i++)
#define REP(i, a, b)  for(int i=(a); i<=(b); i++)
#define DOWN(i, a, b) for(int i=(a); i>=(b); i--)

#define all(x) x.begin(),x.end()
#define low(x) (x)&(-x)
#define pb push_back
typedef long long ll;
typedef double dl;
int t;
char a[sz];
typedef struct node
{
    char data;
    struct node * l,* r;
}TreeNode,*Treet;

void createTree (Treet & root)
{
    char ch;
    cin>>ch;

//  DBG(ch);
    if(‘#‘==ch) root = NULL;
    else
    {
            root=new TreeNode;
            root->data =ch;
            createTree(root->l);
            createTree(root->r);
    }
//1
//524###36##8##
}
void pT(Treet root)
{
    if(root ==NULL) return ;
    cout<<root->data ;
    pT(root->r);

}
void freeTree(Treet   root)
{
    if(root==NULL) return ;
    freeTree(root->l);
    freeTree(root->r);
    delete root;
    //root = NULL;
}
void preTrave(Treet root)
{
    if(root ==NULL) return ;
    cout<<root->data ;
    preTrave (root->l);
    preTrave (root->r);
}
int main()
{
      LOACL
    cin>>t;
    while(t--)
    {

         Treet root;
         createTree( root );
       //   preTrave(root);cout<<endl;
         pT( root);   cout<<endl;
         freeTree(root);
    }

    return 0;
}  

原文地址:https://www.cnblogs.com/corx/p/8997601.html

时间: 2024-11-05 21:56:12

2018大华软件大赛 初赛的相关文章

2018大华软件大赛模拟赛第2题 (特殊的整数)

题目:有一种特殊的正整数(int类型),将数分为两侧,每侧至少有一位数,两侧的每个数字相加相等,请写出判断的方法用来检测是否这种数. 比如:1236,可以拆分为123和6. 输入:输入的第一行指定用例数量T: 用例的第二行输入正整数: 输出:输出是否为特殊的正整数 bool is_magicnum(int number) intput:212321454543622 output:11 1 #include <stdio.h> 2 #include <stdbool.h> 3 4

[2018大华软件创新挑战赛] 初赛1~10题(更新中)

赛题以及注意事项(下载):https://files.cnblogs.com/files/usingnamespace-caoliu/%E5%88%9D%E8%B5%9B.rar 第一题(已优化): 给定一个正数数组,找出不相邻元素的子序列的和的最大值.如:2.5.3.9应该返回14(5+9):8.5.3.9.1应该返回17(8+9):5 4 10 100 10 5应该返回110(5+100+5): 1 #include <stdio.h> 2 #include <unistd.h>

[2018大华软件创新挑战赛]模拟赛第四题

题目 输入 输出 限制 示例 某股票操盘手账户里有N支股票,股价互不等,分别为v1,v2...vn;每支股票的持有股数为m1,m2...mn.现在操盘手要回笼资金需要卖出股票,假设卖出价格即为当前股价,请问能回笼多少种不同的资金量.比如:两支股票,股价分别为10.11,数量为1.2,则能回笼0.10.11.22.21.32,总共6种资金量 输入的第一行指定用例数量T:用例的第一行输入股票种类n:用例的第二行输入股票的价格,以空格隔开:用例的第三行输入股票的数量,已空格隔开: 输出不同资金量的个数

2018工业信息安全技能大赛华东赛区初赛 第2题 writeup

2018工业信息安全技能大赛华东赛区初赛 第2题 解题思路 本题主要考察点是对常见工控协议的理解(modbus/tcp和s7comm),题目目标是寻找出报文中某条异常报文流量.很让人疑惑的是,题目中并没有给出"异常流量"特征的定义,所以需要从多个角度探索出题人的意思. 首先,观察整个抓包文件,其中包含了modbus/tcp.s7comm和极少的tcp周期性握手挥手报文. 之后,针对modbus/tcp和s7comm分别进行深入地分析.此外值得注意的是,一条工控协议报文中至关重要的字段是

2014 CSDN博文大赛初赛晋级名单公布

博文大赛第一阶段(2014年6月10日-2014年7月15日)已经结束,初赛的晋级名单已在7月15日出炉. 现将晋级名单公布: 移动开发 start530              Cocos2dx 小技巧(十五)话说ScrollView的delegate实现过程 wwj_748             Cocos2d-x-Lua示例项目HelloLua Chillax_li             暴走漫画系列之高仿淘宝收货地址(附demo) wwmusic            iOS7 -

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神

计蒜之道2015程序设计大赛初赛第二场——人人都有极客精神 (一)体面 人人公司是一家极为鼓励极客精神的公司,当有重要的项目需要上线但又时间太紧,甚至需要当天上线的时候,往往会挂起海盗旗开启电子日期显示,让大家可以在对时间有更明确的感知的情况下,同心协力搞定重要的项目.海盗旗下方的电子屏显示的日期形式为 YYYYMMDD (年份占 4 位.月份占 2 位.天数占 2 位). 日期电子屏幕上每个数字对应的显示如下图: 从上图可以得知每个数字对应的笔画数,比如 2 的笔画数是 5,8 的笔画数是 7

2014年百度之星程序设计大赛 - 初赛(第二轮)Chess

题目描述:小度和小良最近又迷上了下棋.棋盘一共有N行M列,我们可以把左上角的格子定为(1,1),右下角的格子定为(N,M).在他们的规则中,"王"在棋盘上的走法遵循十字路线.也就是说,如果"王"当前在(x,y)点,小度在下一步可以移动到(x+1, y), (x-1, y), (x, y+1), (x, y-1), (x+2, y), (x-2, y), (x, y+2), (x, y-2) 这八个点中的任意一个. 小度觉得每次都是小良赢,没意思.为了难倒小良,他想出

HDU 6119 小小粉丝度度熊 【预处理+尺取法】(2017&quot;百度之星&quot;程序设计大赛 - 初赛(B))

小小粉丝度度熊 Time Limit: 2000/1000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 1572    Accepted Submission(s): 513 Problem Description 度度熊喜欢着喵哈哈村的大明星--星星小姐. 为什么度度熊会喜欢星星小姐呢? 首先星星小姐笑起来非常动人,其次星星小姐唱歌也非常好听. 但这都不是最重要的,最重要的是

2014第六届华为编程大赛初赛第四轮

/*********************************************************************** 第一题 求n个整数的最大公约数 输入 第一行: n个整数 第二行:各个整数 以空格隔开 输出:公约数 例子: input: 4 10 15 20 25 output: 5 **********************************************************************/ #include <stdio.h>