2024年春季学期《算法分析与设计》练习1

A:时间转换(I)

题目描述

输入一个正整数(秒钟),请将其转换成为如下格式:
时:分:秒。

输入

单组输入,输入一个正整数表示总秒数。

输出

输出转换之后的时间。

样例输入 Copy
1245
样例输出 Copy
0:20:45

#include<stdio.h>
int main()
{
    int t,h,f,s;
    scanf("%d",&t);
    if(t==0)
        printf("0:0:0\n");
    else
    {
        s=t%60;
        f=((t-s)/60)%60;
        h=((t/60-f))/60;
        printf("%d:%d:%d\n",h,f,s);
    }
    return 0;
}

B:数字求和

题目描述

使用递归编写一个程序,计算一个正整数中所有数字之和。例如输入234,输出9。

输入

多组输入,每组输入一个正整数。

输出

输出结果,每个结果占一行。

样例输入 Copy
234
样例输出 Copy
9
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +5;
const int M = 1e9 +7;
const int inf = 0x3fffffff;
int fun(int a)
{
    if(a/10==0)
        return a%10;
    else
        return a%10+fun(a/10);
}
void solve(){
    int n;
    while(cin>>n){
        cout<<fun(n)<<"\n";
    } 
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    //int t;cin>>t;while(t--)
    solve();
    return 0;
}

C:一二三

题目描述

你弟弟刚刚学会写英语的一(one)、二(two)和三(three)。他在纸上写了好些一二三,可惜有些字母写错 了。已知每个单词最多有一个字母写错了(单词长度肯定不会错),你能认出他写的啥吗? 

输入

第一行为单词的个数(不超过 10)。以下每行为一个单词,单词长度正确,且最多有一个字母写错。所有 字母都是小写的。 

输出

对于每组测试数据,输出一行,即该单词的阿拉伯数字。输入保证只有一种理解方式。 

样例输入 Copy
3 
owe 
too 
theee 
样例输出 Copy
1
2
3
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +5;
const int M = 1e9 +7;
const int inf = 0x3fffffff;
void solve(){
    string s;
    cin >> s;
    if (s.size() == 5)
    {
        cout << 3 << '\n';
        return;
    }
    if ((s[0] == 'o' && s[2] == 'e') || (s[0] == 'o' && s[1] == 'n') || (s[1] == 'n' && s[2] == 'e'))
        cout << 1 << '\n';
    else
        cout << 2 << '\n';
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int t;cin>>t;while(t--)
    solve();
    return 0;
}

 D:三家人

题目描述

有三户人家共拥有一作花园,每户人家的太太均需帮忙整理花园。A太太工作了 5天,B太太则工作了 4天,才将花园整理完毕。C 太太因为正身怀六甲无法加入她们的行列,便出了 90 元。请问这笔钱如何分给 A、B二位太太较为恰当?A应得多少元?
90/(5+4)*5=50元?如果这么想你就上当了!正确答案是 60元。如果没想通的话再想想吧。 下面回答一个一般性的问题:假定 A 太太工作了 x 天,B 太太工作了 y 天,C 太太出了 90 元,则 A太太应得多少元?输入保证二位太太均应得到非负整数元钱。

输入

输入第一行为数据组数T( T <=20)。每组数据仅一行,包含三个整数x ,y ,z(1<= x ,y <=10,1<= z <=1000)。

输出

对于每组数据,输出一个整数,即 A太太应得的金额(单位:元)。

样例输入 Copy
2
5 4 90
8 4 123
样例输出 Copy
60
123
提示

本题有个小小的陷阱哦。如果答案错的话,认真检查一下代码吧。

#include<stdio.h>
int main()
{
    int n,a,b,c;
    double d,e;
    scanf("%d",&n);
    while(n--)
    {    scanf("%d%d%d",&a,&b,&c);
    d=(a+b)*1.0/3;
    e=(a-d)/d*c;
    printf("%.0f\n",e);
    }
    return 0;
}

 E:汽水瓶

题目描述

有这样一道智力题:“某商店规定:三个空汽水瓶可以换一瓶汽水。小张手上有十个空汽水瓶,她最多可以换多少瓶汽水喝?”答案是5瓶,方法如下:先用9个空瓶子换3瓶汽水,喝掉3瓶满的,喝完以后4个空瓶子,用3个再换一瓶,喝掉这瓶满的,这时候剩2个空瓶子。然后你让老板先借给你一瓶汽水,喝掉这瓶满的,喝完以后用3个空瓶子换一瓶满的还给老板。如果小张手上有n个空汽水瓶,最多可以换多少瓶汽水喝?

输入

输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=100),表示小张手上的空汽水瓶数。n=0表示输入结束,你的程序不应当处理这一行。

输出

对于每组测试数据,输出一行,表示最多可以喝的汽水瓶数。如果一瓶也喝不到,输出0。

样例输入 Copy
3
10
81
0
样例输出 Copy
1
5
40
#include <bits/stdc++.h>
#define ll long long
#define MM 0x3f3f3f3f
#define pii pair<int, int>
#define pll pair<long long, long long>
using namespace std;
const int N = 1e6 + 5;
const int P = 131;
int dx[] = {0, 0, -1, 1}; //-1, -1, 1, 1};
int dy[] = {1, -1, 0, 0}; // 1, -1, 1, -1};
void solve(){
    int n;
    while(cin>>n&&n){
        cout<<n/2<<"\n";
    }
}
int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    int t=1;
    while (t--){
        solve();
    }
    return 0;
}

F:数字整除

题目描述

定理:把一个至少两位的正整数的个位数字去掉,再从余下的数中减去个位数的5倍。当且仅当差是17的倍数时,原数也是17的倍数 。

    例如,34是17的倍数,因为3-20=-17是17的倍数;201不是17的倍数,因为20-5=15不是17的倍数。输入一个正整数n,你的任务是判断它是否是17的倍数。

输入

输入文件最多包含10组测试数据,每个数据占一行,仅包含一个正整数n(1<=n<=10100),表示待判断的正整数。n=0表示输入结束,你的程序不应当处理这一行。

输出

    对于每组测试数据,输出一行,表示相应的n是否是17的倍数。1表示是,0表示否。

样例输入 Copy
34
201
2098765413
1717171717171717171717171717171717171717171717171718
0
样例输出 Copy
1
0
1
0

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +5;
const int M = 1e9 +7;
const int inf = 0x3fffffff;
void solve(){
    string s;
    while (cin >> s && s[0] != '0')
    {
        int sum = 0;
        for (int i = 0; i < s.size(); i++)
        {
            sum = sum * 10 + s[i] - '0';
            sum %= 17;
        }
        if (sum == 0)
            cout << 1 << "\n";
        else
            cout << 0 << "\n";
    }
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

G:超大型 LED 显示屏

你是学生会体育部长,负责组织一年一度的校篮球比赛。马上就要决赛了,你希望吸引更多的 人来看比赛,因此打算更新一下设备,用一个超大的 LED屏幕来显示比分。当然,电也不是 不要钱的,所以你决定先分析一下往年的比赛,估计一下大概要耗多少电。 

如上图,每个数字由 7条线段组成,每条亮着的线段每秒钟耗电量为 1个单位。线段不亮的时 候不耗电。为了省电,比分不显示前导 0(不过 0分的时候要显示数字 0)。 
你的 LED显示屏共包含 6个数字,即双方的比分各有 3 位数。 

输入

输入包含不超过 100组数据。每组数据第一行为"START hh:mm:ss",表示比赛开始时刻为 hh:mm:ss。最后一行为"END hh:mm:ss",即比赛结束时刻。二者之间至少会有一个 SCORE信 息,格式为"SCORE hh:mm:ss team score",其中 team要么是"home"(主场)要么是"guest"(客 场), score表示得分,为 1,2或者 3。这些信息保证按照时间从早到晚的顺序排列,且任意两 条 SCORE信息的时刻均不相同。比赛开始时间不会早于 9:00,结束时间不会晚于同一天的 21:00。注意,如果比赛开始时间为 09:00:00,结束时间为 09:00:01,比赛长度为 1秒钟,而不 是 2秒钟。

输出

对于每组数据,输出测试点编号和总耗电量。

样例输入 Copy
START 09:00:00
SCORE 09:01:05 home 2
SCORE 09:10:07 guest 3
END 09:15:00
START 09:00:00
SCORE 10:00:00 home 1
SCORE 11:00:00 home 1
SCORE 12:00:00 home 1
SCORE 13:00:00 home 1
SCORE 14:00:00 home 1
SCORE 15:00:00 home 1
SCORE 16:00:00 home 1
SCORE 17:00:00 home 1
SCORE 18:00:00 home 1
SCORE 19:00:00 home 1
SCORE 20:00:00 home 1
END 21:00:00
样例输出 Copy
Case 1: 9672
Case 2: 478800

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +5;
const int M = 1e9 +7;
const int inf = 0x3fffffff;
int aa[10] = {6, 2, 5, 5, 4, 5, 6, 3, 7, 6};
int fun(int n)
{
    int sum = 0;
    if (n == 0)
        return 6;
    while (n)
    {
        sum += aa[n % 10];
        n /= 10;
    }
    return sum;
}
void solve()
{
    string a, b, c;
    int h, m, s;
    char cc, ccc, cccc, ccccc;
    int num = 1;
    while (cin >> a >> h >> cc >> m >> ccc >> s)
    {
        int hh, mm, ss,sum=0;
        int ans1 = 0, ans2 = 0, ans;
        while (1)
        {
            cin >> b >> hh >> cccc >> mm >> ccccc >> ss;
            sum += (fun(ans1) + fun(ans2)) * ((hh - h) * 3600 + (mm - m) * 60 + (ss - s));
            if (b[0] == 'E')
                break;
            cin >> c >> ans;
            if (c[0] == 'h')
                ans1 += ans;
            else
                ans2 += ans;
            h = hh;
            m = mm;
            s = ss;
        }
        cout << "Case " << num++ << ": " << sum << "\n";
    }
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

H:聊天止于呵呵

题目描述

(现代版)俗话说:流言止于智者,聊天止于呵呵。输入一段聊天记录,你的任务是数一数有 多少段对话“止于呵呵”,即对话的最后一句话包含单词 hehe或者它的变形。 
具体来说,我们首先提取出对话的最后一句话,把所有非字母的字符替换成空格,把所有字符 替换成小写,然后导出一个单词列表(由空格隔开),只要列表中的任何一个单词是 hehe,这 段对话就算作“止于呵呵”。比如,"Hi! Are you OK?" 会变成四个单词:hi, are, you, ok。注 意,单词列表可以是空的(比如,这句话是:"?!?!!") 
有些人喜欢使用 hehe的变形,这些变形也应被视为“呵呵”。为了简单起见,本题只考虑由 n(n>1)个 he连接而成的单词,比如 hehehe或者 hehehehe。注意,以 hehe为连续子串的其他单 词不应视为“呵呵”,比如 hehee,或者 ehehe。 
每两个不同人之间的所有对话算作“一段对话”。 

输入

输入仅包含一组数据,每行是一句对话,格式为:

人名 1->人名 2: 一句话.

每行最多包含 1000个字符,最多 100行。 

输出

输出“止于呵呵”的对话段落所占的百分比,四舍五入到最近的整数。输入数据保证答案不会 同时和两个整数最近。 

样例输入 Copy
A->B: Hello!
A->C: Hi!
B->A: Hehe
B->D: Hei!
D->B: How are you?
A->C: Hi???
A->C: Are you there?
B->D: Hehehei!
D->B: What does hehehei mean?
F->E: I want to hehehehehe yah.
样例输出 Copy
50%
提示

样例解释
A 和 B 之间的最后一句话是"Hehe".
A 和 C 之间的最后一句话是"Are you there?".
B 和 D 之间的最后一句话是"What does hehehei mean?".
E 和 F 之间的最后一句话是"I want to hehehehehe yah". 最后第一段和最后一段话是“止于呵呵”的(注意最后一段对话是以呵呵的变种结束),因此 比例是 50%。

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N = 1e5 +5;
const int M = 1e9 +7;
const int inf = 0x3fffffff;
bool fun(string s){
    if(s.size()&1){
        return false;
    }
    for(int i=0;i<s.size();i++){
        if(i&1){
            if(s[i]!='e'){
                return false;
            }
        }
        else{
            if(s[i]!='h'){
                return false;
            }
        }
    }
    return true;
}
void solve(){
    string s1,s2;
    map<pair<string,string>,string> mp;
    while(cin>>s1){
        int i=s1.find("->");
        int j=s1.find(":");
        string a=s1.substr(0,i);
        string b=s1.substr(i+2,j-i-2);
        getline(cin,s2);
        if(a>b){
            swap(a,b);
        }
        mp[{a,b}]=s2;
    }
    double s=0;
    for(auto it:mp){
        string s3="";
        for(auto c:it.second){
            if(isalpha(c)){
                s3+=tolower(c);
            }
            else{
                if(s3!=""&&fun(s3)){
                    s++;
                    s3="";
                    break;
                }
                s3="";
            }
        }
        if(s3!=""&&fun(s3)){
            s++;
        }
    }
    cout<<fixed<<setprecision(0)<<(s/mp.size()*100)<<"%\n";
}
int main() {
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    solve();
    return 0;
}

  • 22
    点赞
  • 26
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值