ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

2020年寒假训练赛IV

2020-02-24 19:39:30  阅读:561  来源: 互联网

标签:输出 12 int 样例 整数 IV 2020 训练赛 输入


问题 A: 时钟

题目描述

有一个标准的12小时时钟,它有一个时针,一个分针。现问你,在给定的两个时刻之间分针与时针相遇几次?

输入

输入包含多组测试数据。每组输入包含4个整数,前两个数字分别表示起始时刻的小时和分,后两个数字分别表示结束时刻的小时和分。
小时数在[1,12]内,分钟数在[0,59]内。
注意:
1)输入中的起始和结束时刻均不会出现时针和分针恰好相遇的情况,例如12点0分。
2)输入中不会出现起始时刻和结束时刻相同的情况。
3)在时针从起始时刻到结束时刻运转的过程中,时针转过的角度一定小于360度。
4)在时针从起始时刻到结束时刻运转的过程中,时针有可能越过表盘上12点钟的刻度。如果越过了,说明起始时刻和结束时刻中一个是A.M.,一个是P.M.。如果没越过,说明起始时刻和结束时刻都是A.M.或都是P.M.。

输出

输出的第一行为“Initial time  Final time  Passes”,具体的输出格式请参照输出样例。可用鼠标选中来看出空格数等细节。

样例输入

12 50  1  2
 3  8  3 20
 2 45 11  0
11  0  3 20
 1  2 12 50
 3 20  3  8

样例输出

Initial time  Final time  Passes
       12:50       01:02       0
       03:08       03:20       1
       02:45       11:00       8
       11:00       03:20       4
       01:02       12:50      11
       03:20       03:08      10

题解:

模拟

从时钟开始时刻到 终止时刻路程转化成分钟,之间相差多少圈基本就相遇几次。

每12小时相遇11次。 所以时间差*11/720即可。 

最后注意一下输出格式,可用鼠标选中来看出空格数等细节。

代码:

#include<bits/stdc++.h> 
using namespace std;
int main()
{
    cout<<"Initial time  Final time  Passes"<<endl;
    int h1, m1, h2, m2;
    while(cin>>h1>>m1>>h2>>m2)
    {
        int s1 = h1, s2 = m1, s3 = h2, s4 = m2;//存储起始时间
        h1 %= 12;
        h2 %= 12;
        if(h2<h1) h2 += 12;
        else if(h2 == h1 && m2<=m1)h2 += 12;
        int t1 = (h1*60+m1)*11;
        int t2 = (h2*60+m2)*11;//转化分钟
        int ans = t2/720 - t1/720;//公式
        printf("       %02d:%02d       %02d:%02d", s1,s2,s3,s4);//注意格式
        printf("%8d\n", ans);
    }
    return 0;
}

问题 B: 舞伴的搭配(partner)

题目描述

学校将要举行一年一度的文艺汇演,笑笑所在年级决定排练一个舞蹈,为选择表演者,老师定下了如下规则:为了舞蹈的美观,当且仅当一男一女的身高之差不超过给定的整数c时,这两个人可以成为舞伴进行演出。笑笑所在年级共有m名男生和n名女生,给定每个人身高(身高是120到220之间的整数),问最多能有多少对舞蹈者进行演出。

例如,有3名女生和3名男生,女生的身高分别是160厘米、170厘米、180厘米,男生的身高分别为170厘米、175厘米、185厘米,c=7厘米。那么最多有2对舞蹈者:可以是女2和男1一组,女3和男2一组,共2组(女1不能和任何男生成为一组),所以这个情况下2将成为最后的答案。

输入

输入分三行:

第一行三个整数m、n、c,分别表示男生人数、女生人数和身高最大差值。

第二行m个整数,分别表示m个男生的身高。

第三行n个整数,分别表示n个女生的身高。

输出

仅一个整数,表示舞蹈者组数的最大数目。

样例输入

3 3 7
170 185 175
160 170 180

样例输出

2

提示

数据规模:

100%数据,满足m,n≤1000

题解:

贪心

大致思路:男生和女生的身高先排个序,再一个个匹配

但是怎么匹配呢?

先找男生第一个和女生第一个匹配,

如果身高差>c且男生更矮就下一个男生

如果身高差>c且女生更矮就下一个女生

如果身高差<=c——匹配成功

代码:

#include<bits/stdc++.h>
using namespace std;
const int MAXN = 1005;
int man[MAXN],woman[MAXN];
int m,n,c;
int main()
{
    cin>>m>>n>>c;
    for(int i = 1;i <= m; ++i) cin>>man[i];
    for(int i = 1;i <= n; ++i) cin>>woman[i];
    sort(man + 1,man + 1 + m,cmp);//男生排序
    sort(woman + 1,woman + 1 + n,cmp);//女生排序
    int num1 = 1,num2 = 1,cnt = 0;         
    while(num1 <= m && num2 <= n)
    {   
        if(man[num1] - woman[num2] > c) num2++; //如果女生矮
        else if(woman[num2] - man[num1] > c) num1++;  //如果男生矮 
        else
        {
            num1++;
            num2++; 
            cnt++;
        }
    }
    printf("%d\n",cnt);
}

问题 C: 心急的C小加

题目描述

C小加有一些木棒,它们的长度和质量都已经知道,需要一个机器处理这些木棒,机器开启的时候需要耗费一个单位的时间,如果第i+1个木棒的重量和长度都大于等于第i个处理的木棒,那么将不会耗费时间,否则需要消耗一个单位的时间。因为急着去约会,C小加想在最短的时间内把木棒处理完,你能告诉他应该怎样做吗?

输入

第一行是一个整数T(1<T<1500),表示输入数据一共有T组。
每组测试数据的第一行是一个整数N(1<=N<=5000),表示有N个木棒。接下来的一行分别输入N个木棒的L,W(0 < L ,W <= 10000),用一个空格隔开,分别表示木棒的长度和质量。

输出

处理这些木棒的最短时间。

样例输入

3 
5 
4 9 5 2 2 1 3 5 1 4 
3 
2 2 1 1 2 2 
3 
1 3 2 2 3 1 

样例输出

2
1
3

题解:

贪心算法+Dilworth定理

1.将木块按照长度上升排序,如果,长度相等,那么,按照重量的大小升序排序。

2.主要是贪心算法+Dilworth定理,因为,两个结点之间,当长度和重量都大于前面的结点,那么,符合我们的要求,所以,可以将已经排序好的序列,分成多个序列,这些序列是按照重量的大小来排序,然后尽可能多的找出符合要求的结点,这里主要用到了贪心算法。

3.我们只要统计有多少个序列,就是得到的结果。

代码:

#include<bits/stdc++.h>
using namespace std; 
struct Node
{
    int l,w;
}data[5005]; 
int vis[5005]; 
int T,n;
int cmp(Node a,Node b)
{
    if(a.l < b.l)return 1;
    else if(a.l == b.l && a.w < b.w)return 1;
    return 0;
}
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d",&n);
        for(int i = 1;i <= n; ++i)
            scanf("%d%d",&data[i].l,&data[i].w);
        memset(vis,0,sizeof(vis));
        sort(data + 1,data + 1 + n,cmp);
        int cnt = 0,zl; 
        for(int i = 1;i <= n; ++i)   
            if(!vis[i]) 
            {   
                cnt++;
                zl = data[i].w;
                for(int j = i + 1;j <= n; ++j)
                    if(zl <= data[j].w && !vis[j]) 
                    {
                        vis[j] = 1;
                        zl = data[j].w; 
                    }
            }
        printf("%d\n",cnt);
    }
    return 0;
}

问题 D: 摧毁巴士站

题目描述

Gabiluso是最伟大的间谍之一。现在,他试图完成一个“不可能完成”的使命――减缓Colugu的军队到达机场的时间。Colugu有n个公共汽车站和m条道路。每条道路直接连接两个巴士站,所有的道路都是单向的。为了保持空气洁净,政府禁止所有军用车辆,因此,军队必须乘搭巴士去机场。两个巴士站之间,可能有超过一条道路。如果一个公共汽车站被破坏时,所有连接该站的道路将无法运作。Gabiluso需要做的是摧毁了一些公共汽车站,使军队无法在K分钟内到达机场。一辆公交车通过一条道路,都是一分钟。所有巴士站的编号从1到n。1号巴士站是在军营,第n号站是机场。军队始终从第一站出发。第一站和第n站不能被破坏,这里有大量的防御力量。当然也没有从第一站到第n站的道路。
请帮助Gabiluso来计算能完成使命所需摧毁的最低数目的巴士站。

输入

第一行包含三个整数n,m,k (2<n<=50,0<m<=4000,0<k<1000)。

接下来m行,每行2个整数s和f,表示从站s到站f有一条路。

输出

输出最少需要摧毁的巴士站数目。

样例输入

 

样例输出

 

提示

【数据规模】
30%的数据N<=15。

题解:

这题我代码不会,思路如下

递归摧毁某个点,然后最短路判断。但是有些点,可能经过他的路径,长度都是大于k的,那么这些点就不必要进行递归。于是,我们每次找一次最短路,看看从1~n的最短路分别经过了哪几个点。因为这里面的点都是在不符合条件的最短路里,所以我们递归那些经过的点删或者不删,直到最短路符合k的条件为止,取一个删的数目最少的为答案即可。

问题 H: 竞技游戏

题目描述

小灰灰和小东东在玩一种竞技游戏。在游戏中,小灰灰给小东东由n个正整数组成的序列以及m条操作指令,需要小东东按照指令来对n个整数进行操作。其中每条指令都包括二个整数(a, b),意义如下:

如果a大于0,表示将序列中第b个数乘于2;

如果a小于0,表示将序列中第b个数加上2;

如果a等于0,则忽略此条指令。

游戏结束后,小东东需要求出序列中的最大值。现在小东东求助于你,希望你能用计算机编程求出他需要的答案。题目保证计算结果在int的表示范围内。

输入

输入数据第一行为一整数T,表示有T组数据。每组输入数据第一行有二个整数n, m, (1 <= n <= 100), (1 <= m <= 100), 第二行有n个整数(1 ~100),表示初始序列,编号从1...n。接着是m行表示m条指令,每行共有2个用空格隔开的整数a b,(-50<= a <= 50), (1 <= b <= n)。

 

输出

对于每组数据,输出一个整数占一行,表示操作后的序列中的最大整数。

样例输入

2
2 2
1 2
1 1
-1 2
3 4
1 5 6
1 1
1 1
0 1
-1 1

样例输出

4
6

题解:

入门的模拟题

代码:

#include<bits/stdc++.h>
const int MAXN = 105;
using namespace std;
int T,n,m,a,b;
int Array[MAXN];
int max_ans;
int main()
{
    scanf("%d",&T);
    while(T--)
    {
        scanf("%d%d",&n,&m);
        for(int i = 1;i <= n; ++i)
            scanf("%d",&Array[i]);
        while(m--)
        {
            scanf("%d%d",&a,&b);
            if(a > 0)
                Array[b] *= 2;
            else if(a < 0)
                Array[b] += 2;
        }
        max_ans = Array[1];
        for(int i = 1;i <= n; ++i)
            max_ans = max(max_ans,Array[i]);
        printf("%d\n",max_ans);
    }
    return 0;
}

问题 I: 手机话费

题目描述

小明的手机每天消费1元,每消费K元就可以获赠1元,一开始小明有M元,问最多可以用多少天?

输入

输入包括多个测试实例。每个测试实例包括2个整数M,K(2<=k<=M<=1000)。M=0,K=0代表输入结束。

输出

对于每个测试实例输出一个整数,表示M元可以用的天数。

样例输入

2 2
4 3
0 0

样例输出

3
5

题解:

语言基础题

代码:

#include<bits/stdc++.h>
using namespace std;
int main()
{
    int m,k;
    while(cin>>m>>k&&m&&k)
    {
        int a=0;
        int count=0;
        while(m)
        {
            m--;
            count++;
            a++;
            if(a==k)
            {
                m++;
                a=0;
            }
        }
        cout<<count<<endl;
    }
    return 0; 
}

 

最炫代码风 发布了60 篇原创文章 · 获赞 12 · 访问量 5092 私信 关注

标签:输出,12,int,样例,整数,IV,2020,训练赛,输入
来源: https://blog.csdn.net/xzerui/article/details/104482351

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有