2021.4.9训练

7-1 冰壶比赛 (20 分)

在3月29日举行的女子冰壶世锦赛决赛中,;钟志颖、陈佳衡、叶翰熙和傅琰组成的中国女子冰壶队以8比6击败了冬奥会和世锦赛双冠王瑞典队,夺得了中国冰壶历史上第一枚世锦赛金牌,创造了历史。美丽、实力兼具的中国冰壶姑娘们也赢得了超高的赞誉。 在冰壶比赛中,给出一个目标点P,以及一个规定的正整数r。每一局由甲乙两队轮流投冰壶各8次后,该局比赛结束。此时,哪一方的冰壶最终离目标点P更近,该方得分,另一方不得分。得分方每颗离目标点P距离小于或等于r、位置较另一队所有冰壶都更接近目标点P的冰壶都可以得1分。 比赛最多进行10局。双方之间的某局比赛结束后,落后一方可以弃权。此时,比赛不再进行下去。 已知每一局结束时,双方的每个冰壶离目标点P的距离,以及正整数r,请你写一个程序判断两队之间每一局比赛的得分,以及总得分。

输入格式:

第一行只有一个正整数r。 以下有若干行(不超过20行),除了最后一行外,每一行有8个正整数(互相之间以一个空格分隔)。 第2行的第j个数表示第1局比赛结束时,甲方的第j个冰壶距离目标点P的距离; 第3行的第j个数表示第1局比赛结束时,乙方的第j个冰壶距离目标点P的距离; 第4行的第j个数表示第2局比赛结束时,甲方的第j个冰壶距离目标点P的距离; 第5行的第j个数表示第2局比赛结束时,乙方的第j个冰壶距离目标点P的距离; … … 第2k行的第j个数表示第k局比赛结束时,甲方的第j个冰壶距离目标点P的距离; 第2k+1行的第j个数表示第k局比赛结束时,乙方的第j个冰壶距离目标点P的距离; 如果有一方中途弃权,则最后一行(偶数行)只有一个整数-1,表示此时发生弃权情况。

输出格式:

有若干行,每行有二个整数,中间以一个冒号分隔,表示每一局比赛甲乙双方的比分(甲得分在前)。 最后一行有二个整数,中间以一个冒号分隔,表示甲乙双方比赛的最终得分(甲得分在前)。

输入样例1:

8
5  20  18  19  3  15  13  3
20  2  17  12  5  18  10  11
20  3  4  1  2  11  9  2
1  15  19  9  8  14  11  10
15  2  10  1  19  14  3  18
15  17  21  19  24  32  19  26
-1

输出样例1:

0:1
0:0
3:0
3:1

输入样例2:

8
5  20  18  19  3  15  13  3
20  2  17  12  5  18  10  11
20  3  4  1  2  11  9  2
1  15  19  9  8  14  11  10
15  2  10  1  19  14  3  18
15  17  21  19  24  32  19  26
5  1  14  13  15  2  3  11
14  7  5  19  10  12  6  9
3  14  9  8  4  8  3  10
14  6  9  4  8  2  1  5
9  8  1  2  8  8  7  18
16  8  20  19  3  1  10  5
2  13  19  2  18  9  18  3
6  5  5  20  6  17  2  18
17  3  20  6  9  3  17  17
20  10  8  12  19  19  18  20
15  18  4  18  17  14  5  16
6  14  8  14  19  7  13  7
15  9  2  8  20  3  10  14
8  6  3  2  4  11  4  10

输出样例2:

0:1
0:0
3:0
3:0
0:2
0:0
0:0
3:0
2:0
0:0
11:3

【样例说明】 在样例1和样例2中: 第1局比赛时,甲方离目标点P的最近距离为3,乙方离目标点P的最近距离为2,乙方得分。乙比甲方的3更小的值只有1个(值为2壶),因此乙方得1分。 第2局比赛时,甲方离目标点P的最近距离为1,乙方离目标点P的最近距离为1,双方均不得分。 第3局比赛时,甲方离目标点P的最近距离为1,乙方离目标点P的最近距离为15,甲方得分。甲比乙方的15小的值有5个(2、10、1、14、3),但小于等于r=8的值只有3个(2、1、3),因此甲得3分。 样例1只进行了3局,总得分为3:1,样例2所有10局比赛进行完,总得分为11:3。

【数据限制】70%的数据,双方均不弃权,比赛进行10局。 100%的数据,每只冰壶距离目标点P的距离不超过100。

思路:对每次比赛进行排序,小的排前面,看谁更小谁就得分,同时要判断一下跟r的距离,特判一下放弃比赛-1的情况

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int r ;
    cin>>r;
    int nums_jia = 0 , nums_yi  = 0; 
    bool flog = false;
    int A[10] , B[10];
    for(int i = 0 ; i < 10 ; i++){
        for(int j = 0 ; j < 8 ; j++){
            cin>>A[j];
            if(A[j] == -1){
                flog = true;
                break;
            }
        }
        if(flog) break;
        for(int j = 0 ; j < 8 ; j++)
            cin>>B[j];
        sort(A,A+8);
        sort(B,B+8);
        int sum_jia = 0 ;
        int sum_yi = 0 ;
        if(A[0] < B[0] && A[0] <= r){ // 甲赢 
            for(int j = 0 ; j < 8 ; j++){
                if(A[j] < B[0] && A[j] <= r){
                    sum_jia ++ ;
                }
                else break;
            }
        }
        else if(A[0] > B[0] && B[0] <= r){
            for(int j = 0 ; j < 8 ; j++){
                if(B[j] < A[0] && B[j] <= r)
                    sum_yi ++;
                else break;
            }
        }
        cout<<sum_jia<<":"<<sum_yi<<endl;
        nums_jia += sum_jia;
        nums_yi += sum_yi; 
    }
    cout<<nums_jia<<":"<<nums_yi<<endl;
    return 0;    
}
7-2 汉明距离 (15 分)

两个整数间的汉明距离指的是这两个数对应二进制位不同的位置的数目。输入两个整数x,y, 0<=x,y<=231​​。输出x,y的汉明距离。

输入格式:

在一行输入x,y。

输出格式:

在一行输出x,y汉明距离。

输入样例:

在这里给出一组输入。例如:

1 4

输出样例:

在这里给出相应的输出。例如:

2 

思路:把数字转成二进制的,不断%2,看看相同不相同

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int x , y ;
    cin>>x>>y;
    int len = 0 ;
    while(x > 0 || y > 0){
        if((x % 2) != (y%2)){
            len ++;
            
        }
        x /= 2 ;
        y/=2;
    }
    cout<<len<<endl;
    return 0;    
}
7-3 可爱的Tommy (5 分)
 John带上小狗Tommy去见女友Mary,他们同时出发相向而行。Tommy跑得快,遇到Mary以后就往回跑,遇到John以后再往回跑,……,直到两人相遇。请问:Tommy一共跑了多少路程?

输入格式

开始时两人之间的距离(km)
John、Mary和Tommy的速度(/)

输出格式

Tommy所跑的路程(km)

要求:输出2位小数(末位四舍五入)。

输入样例:

43.5
3.6 2.8 22.5

输出样例:

152.93

这种题,最好都用double,用float错的话,你都不懂错哪里

#include<bits/stdc++.h>
using namespace std;
int main()
{    
    double num , J , M , T;
    cin>>num>>J>>M>>T;
    double sum = 0 ;
    double sum_J = 0 , sum_M = 0 , sum_T = 0;
    double jiange = J+M;
    printf("%.2f\n" , (num/jiange)*T);
    return 0;    
}
7-4 运行超时 (10 分)
 

在数据结构上机实验中,当你的程序运行时间过长,超出题目限定的时间,将得到“TimeLimit”错误。对题目设定合理的运行时间限制非常重要。

对于每道题目,都有一个由作者亲自编写的标准程序,称为“主标准程序”此外,还有一些可以通过该题的其他标准程序,称为“标准程序”。 假定一共有n个程序,编号为1至n。其中第1个程序为“主标准程序”,其余程序为“标准程序”。假定第i个程序的运行时间为ai​​秒。

朱老师准备按如下规则设定每道题目的运行时限x:

  • 时限不能过于严格,即x3a1​​;
  • “标准程序”必须都能通过,即,);
  • x须为满足上述条件的最小偶数。

请编写程序帮助朱老师计算每道题目的运行时间限制x。

输入格式:

本题包含多组测试数据,第一行为一个整数T (1 ≤ T ≤ 10),表示测试数据组数。对于每组测试数据,第一行为一个整数n (2 ≤ n ≤ 10),表示程序数目,第二行为n个整数表示程序的运行时间 ,。

输出格式:

对于每组测试数据,输出一个整数x。

输入样例:

2
2
1 3
2
1 4

输出样例:

4
6

思路:按题意模拟就行了

 

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int T;
    cin>>T;
    while(T--){
        int n ;
        cin>>n;
        int x = 0;
        n--;
        int temp ;
        cin>>temp;
        x = 3*temp;
        while(n--){
            cin>>temp;
            x = max(x , temp+1);
        }
        cout<<(x%2==0?x : x+1) <<endl;
    }
    return 0;
}

7-5 找“重点” (10 分)

 在一个N×N的矩阵中,如果某个元素的值大于其上下左右四个相邻元素之和,则本题称这个元素为“重点”。本题要求寻找给定矩阵中的所有“重点”。

需要注意的是:

  • 矩阵中元素的坐标采用(x,y)的形式,x为元素所在的行号、y为元素所在的列号,xy均从0开始
  • 矩阵的行号由上至下增长;列号从左到右增长
  • 最上方一行的元素,其“上方”相邻元素,位于同列的最下方一行
  • 最下方一行的元素,其“下方”相邻元素,位于同列的最上方一行
  • 最左方一列的元素,其“左方”相邻元素,位于同行的最右方一列
  • 最右方一列的元素,其“右方”相邻元素,位于同行的最左方一列

输入格式:

第一行给出一个不大于400的正整数N

接下来N行,每行N个不超过500的正整数,用空格分隔,依次是矩阵从最上方一行开始、每行从左至右排列的N×N个元素。

输出格式:

如果矩阵中有“重点”,则在每行输出一个“重点”元素的坐标,若需要输出的元素多于一个,则按照行号从小到大、同一行中列号从小到大的顺序输出。每个坐标先输出行号、再输出列号,中间空一格。

如果矩阵中没有“重点”,则在一行中先输出None!然后输出矩阵中所有元素之和,中间空一格。

输入样例1:

4
1 1 1 1
1 5 1 5
1 1 1 1
1 1 5 1

输出样例1:

1 1
1 3
3 2

输入样例2:

3
1 1 1
1 1 1
1 1 1

输出样例2:

None! 9

思路:主要是func函数里的,把一个点的上下左右遍历,暴力搜

#include<bits/stdc++.h>
using namespace std;
int nums[500][505];
int N;
int func(int i , int j){
    int sum = 0 ;
    
    sum += nums[i+1==N?0:i+1][j];
    sum += nums[i][j+1==N?0:j+1];
    sum += nums[i][j-1 < 0 ? N-1 : j-1];
    sum += nums[i-1 < 0 ? N-1 : i-1][j];
    return sum ;
}
int main()
{
    int a ;
    
    cin>>N;
    int p = 0;
    for(int i = 0 ; i < N ; i++)
        for(int j = 0; j<N;j++){
            cin>>nums[i][j];
            p+=nums[i][j];
        }
            
    bool flog = false;
    for(int i = 0; i < N ; i++){
        for(int j = 0 ; j < N ;j++){
            int sum = 0 ;
            sum += func(i , j);
            if(sum < nums[i][j]){
                cout<<i<<" "<<j<<endl;
                flog = true;
            }
        } 
    }
    if(!flog){
        cout<<"None! "<<p<<endl;
    }
    return 0;    
} 

7-6 转圈游戏(2013慈溪) (15 分)

 

 

 

4 1
2 3

输出样例:

1
2
3
0

思路:这道题最重要的是“造环”,,就是把这个数组做个一个环状的,

如:0 1 2 3 4 5 这个数据怎么形成环,就是直接在数据的后面在接上一个数组啊

0 1 2 3 4 5 0 1 2 3 4 5 , 这不就形成环了吗

移动的时候,刚开始的指针为0 , 就记录一下指针的移动就行了,

+b 迁移

-b 后移

最后把指针还原到0-(n-1)的区间

指针<0 : while(指针<0) 指针+=n

指针>0 : 指针%=n 

#include<bits/stdc++.h>
using namespace std;
int nums[200005];
int main()
{
    int n , q ;
    cin>>n>>q;int len = 0 ;
    for(int i = 0; i < n ; i++) nums[i] = i ;
    for(int i = n; i < (n*2) ; i++) nums[i] = i-n;
    //for(int i = 0 ; i<n*2 ; i++) cout<<nums[i]<<' ';
    while(q--){
        int a , b;
        cin>>a>>b;
        if(a == 1){
            len+=b;
        }
        else{
            len-=b;
        }
    }
    while(len < 0) len+=n;
    len = len%n;
    for(int i = len ; i < len+n ;i++) cout<<nums[i]<<endl;
    return 0;    
}
7-8 你究竟有几个好妹妹 (20 分)
 

小李的QQ列表里有很多联系人,他修改了所有人的备注姓名。其中有些联系人名字的前部或后部被加了诸如"好妹妹"的字样。请你打印出小李的所有的女性"好妹妹"。打印时请按照联系人原始名字升序排列,如果两人名字相同则年龄小的排在前面;如果两人年龄相同,则较早成为好友的排在前面。题目保证好妹妹标志不会同时出现在前缀和后缀,同一天里也不会添加名字相同并且年龄相同的"好妹妹"。

输入格式:

第一行给出标识好妹妹标志的字符串,该字符串内不包含空格,最大长度为6并且不区分大小写。第二行给出QQ列表的所有联系人个数n (1≤ n ≤105​​),随后n行列出所有联系人信息,每行信息格式如下:

备注姓名 性别 年龄 结交好友日期

其中备注姓名不超过30个字符;性别用字符表示,F表示女性,M代表男性;结交好友日期采用诸如"2001.01.01"的格式表示。

输出格式:

第一行输出好妹妹的数目k,随后k行打印出去掉好妹妹标志的名字、年龄以及结交好友日期。

输入样例:

例如:

hmm
10
Zoehmm F 28 2001.01.01
hmmBeith F 18 2010.10.21
Zack M 35 1999.09.18
hmmAdam F 21 2010.10.21
Beithhmm F 21 2010.10.21
Chelse F 45 2005.12.03
DaisyHMM F 30 2008.08.05
Eston M 18 2015.03.04
hmmFrany F 8 2018.07.15
JackHM F 7 2017.09.11

输出样例:

输出:

6
Adam 21 2010.10.21
Beith 18 2010.10.21
Beith 21 2010.10.21
Daisy 30 2008.08.05
Frany 8 2018.07.15
Zoe 28 2001.01.01

思路:这道题我写的有点乱,其实就是STL的运用 , 叫hmm的人有可能是男的,要判断一下 , 我把字符全部转化为小写的在操作,

#include<bits/stdc++.h>
using namespace std;
struct node{
    string name;
    char sex;
    int age;
    string time;
};
string hmm;
node nums[100005];
vector<node> vec;
int pps = 0 ;
bool ishmm(string str){
    for(int i = 0 ; i < str.size() ; i++){
        if(str[i] >='A' && str[i] <= 'Z'){
            str[i]+=32;
        }
    }
    bool flog = false;
    int i;
    for(i = 0 ; i < hmm.size() ; i++){
        if(hmm[i] != str[i])
            break;
    }
    if(hmm.size() == i){
        pps = 1 ;
        return true;
    }
    int j;
    for(i = str.size()-1 , j = hmm.size()-1; j >= 0 && i >= 0 ; i-- , j-- ){
        if(str[i] != hmm[j])
            return false;
    }
    pps = 2;
    return true;
    
}
bool cmp(node a , node b){
    if(a.name == b.name){
        if(a.age == b.age){
            return a.time < b.time;
        }
        return a.age < b.age;
    }
    return a.name < b.name;
}
int main()
{
    
    cin>>hmm;
    for(int i= 0 ; i < hmm.size() ; i++)
        if(hmm[i] >='A' && hmm[i] <= 'Z')
            hmm[i]+=32;
    int n ;
    cin>>n;
    int k = 0 ;
    for(int i =0 ; i< n ; i++){
        cin>>nums[i].name>>nums[i].sex>>nums[i].age>>nums[i].time;
        pps = 0 ;
        if(ishmm(nums[i].name) && nums[i].sex == 'F'){
            if(pps == 1){
                string temp = nums[i].name.substr(hmm.size() , nums[i].name.size()-hmm.size());    
                nums[i].name = temp;
            }
            else if(pps == 2){
                string temp = nums[i].name.substr(0, nums[i].name.size()-hmm.size());    
                nums[i].name = temp;
            }
            node temp_ = nums[i];
            vec.push_back(temp_);
        }
    }
    sort(vec.begin() , vec.end() , cmp);
    cout<<vec.size()<<endl;
    for(int i = 0;  i < vec.size() ; i++){
        cout<<vec[i].name<<" "<<vec[i].age<<" "<<vec[i].time<<endl;
    }
    
    return 0;    
}
7-9 括号匹配 (25 分)

描述:

假设表达式中只包含三种括号:圆括号、方括号和花括号,它们可相互嵌套,如([{}])或({[][()]})等均为正确的格式,而{[]})}或{[()]或([]}均为不正确的格式.

输入一串括号

如果输入的右括号多余,输出:Extra right brackets

如果输入的左括号多余, 输出:Extra left brackets

如果输入的括号不匹配,输出:Brackets not match

如果输入的括号匹配,输出:Brackets match

输入格式:

一行只含 ( ) [ ] { } 这6种字符,不含其它任何字符的字符串。字符串不超过1000个字符。

输出格式:

如果输入的右括号多余,输出:

Extra right brackets
 如果输入的左括号多余, 输出:
Extra left brackets
 如果输入的括号不匹配,输出:
Brackets not match
 如果输入的括号匹配,输出:
Brackets match

输入样例:
{{{{)))

输出样例:

Brackets not match

 

#include<bits/stdc++.h>
using namespace std;
const int manx = 1005;
int main()
{
    string str;
    cin>>str;
    stack<char> s;
    
    for(int i =0 ; i < str.size() ; i++){
        if(str[i] == '(' || str[i]=='{' || str[i] == '[')
            s.push(str[i]);
        else if(s.empty()){
            cout<<"Extra right brackets"<<endl;
            return 0;
        }
        else if(str[i] == ')' && s.top()!='('){
            cout<<"Brackets not match"<<endl;
            return 0;
        }
        else if(str[i] == ']' && s.top() != '['){
            cout<<"Brackets not match"<<endl;
            return 0;
        }
        else if(str[i] == '}' && s.top() != '{'){
            cout<<"Brackets not match"<<endl;
            return 0;
        }
        else s.pop();
    }
    if(s.empty()) cout<<"Brackets match"<<endl;
    else cout<<"Extra left brackets"<<endl;
    return 0;
} 

 

 

 



 

 

 

 

 

 

 

posted @ 2021-04-09 22:53  .李宁宁  阅读(215)  评论(0编辑  收藏  举报