其他分享
首页 > 其他分享> > 2021-01-29

2021-01-29

作者:互联网

问题 A: 火星人问题

时间限制: 1 Sec  内存限制: 64 MB
提交 状态

题目描述

人类终于登上了火星的土地并且见到了神秘的火星人。人类和火星人都无法理解对方的语言,但是我们的科学家发明了一种用数字交流的方法。这种交流方法是这样的,首先,火星人把一个非常大的数字告诉人类科学家,科学家破解这个数字的含义后,再把一个很小的数字加到这个大数上面,把结果告诉火星人,作为人类的回答。

火星人用一种非常简单的方式来表示数字――掰手指。火星人只有一只手,但这只手上有成千上万的手指,这些手指排成一列,分别编号为1,2,3……。火星人的任意两根手指都能随意交换位置,他们就是通过这方法计数的。

一个火星人用一个人类的手演示了如何用手指计数。如果把五根手指――拇指、食指、中指、无名指和小指分别编号为1,2,3,4和5,当它们按正常顺序排列时,形成了5位数12345,当你交换无名指和小指的位置时,会形成5位数12354,当你把五个手指的顺序完全颠倒时,会形成54321,在所有能够形成的120个5位数中,12345最小,它表示1;12354第二小,它表示2;54321最大,它表示120。下表展示了只有3根手指时能够形成的6个3位数和它们代表的数字:
三进制数
123 132 213 231 312 321

代表的数字
1 2 3 4 5 6

现在你有幸成为了第一个和火星人交流的地球人。一个火星人会让你看他的手指,科学家会告诉你要加上去的很小的数。你的任务是,把火星人用手指表示的数与科学家告诉你的数相加,并根据相加的结果改变火星人手指的排列顺序。输入数据保证这个结果不会超出火星人手指能表示的范围。

输入

包括三行,第一行有一个正整数N,表示火星人手指的数目(1 <= N <= 10000)。第二行是一个正整数M,表示要加上去的小整数(1 <= M <= 100)。下一行是1到N这N个整数的一个排列,用空格隔开,表示火星人手指的排列顺序。

输出

只有一行,这一行含有N个整数,表示改变后的火星人手指的排列顺序。每两个相邻的数中间用一个空格分开,不能有多余的空格。

样例输入 Copy

5
3
1 2 3 4 5

样例输出 Copy

1 2 4 5 3

提示

对于全部的数据,N<=10000;

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    int n, m, a[10001]; cin >> n >> m;

    for(int i = 0; i < n; i++) cin >> a[i];
    for(int i = 0; i < m; i++) next_permutation(a,a+n);
    for(int i = 0; i < n; i++) cout << a[i] << " ";

    return 0;
}

 

问题 B: FBI树

时间限制: 1 Sec  内存限制: 64 MB
提交 状态

题目描述

上古文明遗迹的探险任务最终决定交由墨老师带领完成。他们打开第一个宝藏的条件是解决FBI树问题。所谓FBI树的描述如下:

我们可以把由“0”和“1”组成的字符串分为三类:全“0”串称为B串,全“1”串称为I串,既含“0”又含“1”的串则称为F串。FBI树是一种二叉树,它的结点类型也包括F结点,B结点和I结点三种。由一个长度为2N的“01”串S可以构造出一棵FBI树T,递归的构造方法如下:

(1) T的根结点为R,其类型与串S的类型相同。

(2) 若串S的长度大于1,将串S从中间分开,分为等长的左右子串S1和S2;由左子串S1构造R的左子树T1,由右子串S2构造R的右子树T2。

现在给定一个长度为2N的“01”串,请用上述构造方法构造出一棵FBI树,并输出它的后序遍历序列。

输入

第一行是一个整数N(0≤N≤10),第二行是一个长度为2N的“01”串。

输出

包括一行,这一行只包含一个字符串,即FBI树的后序遍历序列。

样例输入 Copy

3
10001011

样例输出 Copy

IBFBBBFIBFIIIFF

提示


对于40%的数据,N≤2;
对于全部的数据,N≤10。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

char s[1050];

void Fact(int x, int st, int ed)
{
    if(x < 0) return ;

    int mid = (st + ed) / 2;
    if(x == 0)
    {
        if(s[st] == '0') cout<<'B';
        if(s[st] == '1') cout<<'I';
    }
    else if(x > 0)
    {
        Fact(x - 1, st, mid);
        Fact(x - 1, mid + 1, ed);
        bool f0 = false;
        bool f1 = false;
        for(int i = st; i <= ed; i++)
        {
            if(s[i] == '0') f0 = true;
            if(s[i] == '1') f1 = true;
            if(f0 && f1) break;
        }
        if(f0 && f1) cout<<'F';
        else if(f0) cout<<'B';
        else if(f1) cout<<'I';
    }
    return ;
}

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    int n; cin>>n;
    int cnt = pow(2, n);// cout<<cnt<<'\n';
    for(int i = 1; i <= cnt; i++)
    {
        cin>>s[i];
//        cout<<s[i];
    }
//    cout<<'\n';
    Fact(n, 1, cnt);
    cout<<'\n';
    return 0;
}

 

问题 C: 不高兴的津津

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

津津上初中了。妈妈认为津津应该更加用功学习,所以津津除了上学之外,还要参加妈妈为她报名的各科复习班。另外每周妈妈还会送她去学习朗诵、舞蹈和钢琴。但是津津如果一天上课超过八个小时就会不高兴,而且上得越久就会越不高兴。假设津津不会因为其它事不高兴,并且她的不高兴不会持续到第二天。请你帮忙检查一下津津下周的日程安排,看看下周她会不会不高兴;如果会的话,哪天最不高兴。

输入

输入包括七行数据,分别表示周一到周日的日程安排。每行包括两个小于10的非负整数,用空格隔开,分别表示津津在学校上课的时间和妈妈安排她上课的时间。

输出

输出包括一行,这一行只包含一个数字。如果不会不高兴则输出0,如果会则输出最不高兴的是周几(用1, 2, 3, 4, 5, 6, 7分别表示周一,周二,周三,周四,周五,周六,周日)。如果有两天或两天以上不高兴的程度相当,则输出时间最靠前的一天。

样例输入 Copy

5 3
6 2
7 2
5 3
5 4
0 4
0 6

样例输出 Copy

3

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    int max = 0; int vis = 0;
    int a,b;
    for(int i = 1; i <= 7; i++)
    {
        cin>>a>>b;
        if(a + b > 8 && a + b > max)
        {
            max = (a + b);
            vis = i;
        }
    }
    cout<<vis<<'\n';
    return 0;
}

 

问题 D: 花生采摘

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

鲁宾逊先生有一只宠物猴,名叫多多。这天,他们两个正沿着乡间小路散步,突然发现路边的告示牌上贴着一张小小的纸条:“欢迎免费品尝我种的花生!——熊字”。
鲁宾逊先生和多多都很开心,因为花生正是他们的最爱。在告示牌背后,路边真的有一块花生田,花生植株整齐地排列成矩形网格(如图1)。有经验的多多一眼就能看出,每棵花生植株下的花生有多少。为了训练多多的算术,鲁宾逊先生说:“你先找出花生最多的植株,去采摘它的花生;然后再找出剩下的植株里花生最多的,去采摘它的花生;依此类推,不过你一定要在我限定的时间内回到路边。”
我们假定多多在每个单位时间内,可以做下列四件事情中的一件:
1) 从路边跳到最靠近路边(即第一行)的某棵花生植株;
2) 从一棵植株跳到前后左右与之相邻的另一棵植株;
3) 采摘一棵植株下的花生;
4) 从最靠近路边(即第一行)的某棵花生植株跳回路边。
现在给定一块花生田的大小和花生的分布,请问在限定时间内,多多最多可以采到多少个花生?注意可能只有部分植株下面长有花生,假设这些植株下的花生个数各不相同。
例如在图2所示的花生田里,只有位于(2, 5), (3, 7), (4, 2), (5, 4)的植株下长有花生,个数分别为13, 7, 15, 9。沿着图示的路线,多多在21个单位时间内,最多可以采到37个花生。

输入

输入的第一行包括三个整数,M, N和K,用空格隔开;表示花生田的大小为M * N(1 <= M, N <= 20),多多采花生的限定时间为K(0 <= K <= 1000)个单位时间。接下来的M行,每行包括N个非负整数,也用空格隔开;第i + 1行的第j个整数Pij(0 <= Pij <= 500)表示花生田里植株(i, j)下花生的数目,0表示该植株下没有花生。

输出

输出包括一行,这一行只包含一个整数,即在限定时间内,多多最多可以采到花生的个数。

样例输入 Copy

6 7 21
0 0 0 0 0 0 0
0 0 0 0 13 0 0
0 0 0 0 0 0 7
0 15 0 0 0 0 0
0 0 0 9 0 0 0
0 0 0 0 0 0 0

样例输出 Copy

37

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

typedef struct
{
    int h,l,w,t,bk;
}Node;

Node a[405] = {0};

bool cmp(Node x, Node y)
{
    return x.w > y.w;
}

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    int H,L,T; cin>>H>>L>>T;

    int vis = 1;
    for(int i = 1; i <= H; i++)
    {
        for(int j = 1; j <= L; j++)
        {
            a[vis].h = i; a[vis].l = j;
            cin>>a[vis].w;
            vis++;
//            cout<<a[vis].w;
        }
    }
    sort(a + 1, a + 1 + H * L, cmp);
//    for(int i = 1; i <= H * L; i++) cout<<a[i].w;    
    for(int i = 1; i <= H * L; i++)
    {
        if(a[i].w)
        {
            if(i == 1)
            {
                a[i].t = a[i].h + 1;
            }    
            else
            {
                a[i].t = a[i - 1].t + abs(a[i].h - a[i - 1].h) + abs(a[i].l - a[i - 1].l) + 1;
            }
            a[i].bk = a[i].t + a[i].h;
//            cout<<a[i].t<<' '<<a[i].bk<<'\n';
        }
        else
        {
            a[i].bk = 0;
            a[i].t = 0;
        }
    }

    int ans = 0;
    for(int i = 1; i <= H * L; i++)
    {
        if(!a[i].w) break;
        if(T >= a[i].bk)
        {
            ans += a[i].w;
//            cout<<a[i].h<<a[i].l<<a[i].w<<'\n';
        }
    }
    cout<<ans<<'\n';
    return 0;
}

 

问题 E: Trapezoids

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

You are given a trapezoid. The lengths of its upper base, lower base, and height are a, b, and h, respectively.

An example of a trapezoid

Find the area of this trapezoid.

Constraints
1≦a≦100
1≦b≦100
1≦h≦100
All input values are integers.
h is even.

输入

The input is given from Standard Input in the following format:
a
b
h

输出

Print the area of the given trapezoid. It is guaranteed that the area is an integer.

样例输入 Copy

3
4
2

样例输出 Copy

7

提示

When the lengths of the upper base, lower base, and height are 3, 4, and 2, respectively, the area of the trapezoid is (3+4)×2/2=7.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    long long a,b,c;
    cin>>a>>b>>c;
    long long ans = (a + b) * c / 2;
    cout<<ans<<'\n';
    return 0;
}

 

问题 F: Card Game for Three

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

Alice, Bob and Charlie are playing Card Game for Three, as below:

At first, each of the three players has a deck consisting of some number of cards. Each card has a letter a, b or c written on it. The orders of the cards in the decks cannot be rearranged.
The players take turns. Alice goes first.
If the current player's deck contains at least one card, discard the top card in the deck. Then, the player whose name begins with the letter on the discarded card, takes the next turn. (For example, if the card says a, Alice takes the next turn.)
If the current player's deck is empty, the game ends and the current player wins the game.
You are given the initial decks of the players. More specifically, you are given three strings SA, SB and SC. The i-th (1≦i≦|SA|) letter in SA is the letter on the i-th card in Alice's initial deck. SB and SC describes Bob's and Charlie's initial decks in the same way.

Determine the winner of the game.

Constraints
1≦|SA|≦100
1≦|SB|≦100
1≦|SC|≦100
Each letter in SA, SB, SC is a, b or c.

输入

The input is given from Standard Input in the following format:
SA
SB
SC

输出

If Alice will win, print A. If Bob will win, print B. If Charlie will win, print C.

样例输入 Copy

aca
accc
ca

样例输出 Copy

A

提示

The game will progress as below:
Alice discards the top card in her deck, a. Alice takes the next turn.
Alice discards the top card in her deck, c. Charlie takes the next turn.
Charlie discards the top card in his deck, c. Charlie takes the next turn.
Charlie discards the top card in his deck, a. Alice takes the next turn.
Alice discards the top card in her deck, a. Alice takes the next turn.
Alice's deck is empty. The game ends and Alice wins the game.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    string a,b,c; cin>>a>>b>>c;
//    cout<<a<<b<<c;
    int la = a.size();
    int lb = b.size();
    int lc = c.size();
//    cout<<la<<lb<<lc;    
    stack <char> sa; sa.push('d');
    stack <char> sb; sb.push('d');
    stack <char> sc; sc.push('d');
    
    for(int i = la - 1; i >= 0; i--) sa.push(a[i]);
    for(int i = lb - 1; i >= 0; i--) sb.push(b[i]);
    for(int i = lc - 1; i >= 0; i--) sc.push(c[i]);
//    cout<<sa.size()<<sb.size()<<sc.size();    

    char s = sa.top();sa.pop();
//    cout<<s;
    while((!sa.empty()) && (!sb.empty()) && (!sc.empty()))
    {
        if(s == 'a')
        {
            s = sa.top();
            sa.pop();
        }
        if(s == 'b')
        {
            s = sb.top();
            sb.pop();
        }
        if(s == 'c')
        {
            s = sc.top();
            sc.pop();
        }
    }

    if(sa.empty()) cout<<'A'<<'\n';
    if(sb.empty()) cout<<'B'<<'\n';
    if(sc.empty()) cout<<'C'<<'\n';

    return 0;
}

 

问题 K: Do You Know Your ABCs?

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

Farmer John's cows have been holding a daily online gathering on the "mooZ" video meeting platform. For fun, they have invented a simple number game to play during the meeting to keep themselves entertained.
Elsie has three positive integers A, B, and C (A≤B≤C). These integers are supposed to be secret, so she will not directly reveal them to her sister Bessie. Instead, she gives Bessie seven (not necessarily distinct) integers in the range 1…10^9, claiming that they are A, B, C, A+B, B+C, C+A, and A+B+C in some order.

Given a list of these seven numbers, please help Bessie determine A, B, and C. It can be shown that the answer is unique.

输入

The only line of input consists of seven space-separated integers.

输出

Print A, B, and C separated by spaces.

 

样例输入 Copy

2 2 11 4 9 7 9

样例输出 Copy

2 2 7

提示

Test cases 2-3 satisfy C≤50.
Test cases 4-10 satisfy no additional constraints.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    long long a[10];
    for(int i = 1; i <= 7; i++) cin>>a[i];
    
    sort(a + 1, a + 1 + 7);
    
    long long a1; a1 = a[1];

    long long b = a[7] - a[1]; int vis;
    for(int i = 1; i <= 7; i++)
    {
        if(a[i] == b)
        {
            vis = i;
            break;
        }
    }

    for(int i = 2; i <= vis - 1; i++)
    {
        for(int j = 2; j <= vis - 1; j++)
        {
            if(i == j) continue;
            if(a[i] + a[j] == b)
            {
                cout<<a1<<' '<<a[i]<<' '<<a[j]<<'\n';
                return 0;
            }
        }
    }

    return 0;
}

 

问题 L: Daisy Chains

时间限制: 1 Sec  内存限制: 128 MB
提交 状态

题目描述

Every day, as part of her walk around the farm, Bessie the cow visits her favorite pasture, which has N flowers (all colorful daisies) labeled 1…N lined up in a row (1≤N≤100). Flower i has pi petals (1≤pi≤1000).
As a budding photographer, Bessie decides to take several photos of these flowers. In particular, for every pair of flowers (i,j) satisfying 1≤i≤j≤N, Bessie takes a photo of all flowers from flower i to flower j (including i and j).

Bessie later looks at these photos and notices that some of these photos have an "average flower" -- a flower that has P petals, where P is the exact average number of petals among all flowers in the photo.

How many of Bessie's photos have an average flower?

输入

The first line of input contains N. The second line contains N space-separated integers p1…pN.

输出

Please print out the number of photos that have an average flower.

样例输入 Copy

4
1 1 2 3

样例输出 Copy

6

提示

Every picture containing just a single flower contributes to the count (there are four of these in the example). Also, the (i,j) ranges (1,2) and (2,4) in this example correspond to pictures that have an average flower.

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <time.h>
#include <ctype.h>
#include <queue>
#include <stack>
#include <vector>
#include <string>
#include <algorithm>
#include <iostream>

using namespace std;

double a[105] = {0};
double b[105] = {0};

int main()
{
    ios::sync_with_stdio(false),cin.tie(NULL);
    int n; cin>>n;
    for(int i = 1; i <= n; i++)
    {
        cin>>b[i];
        a[i] = a[i - 1] + b[i];
    }

    double t;
    long long ans = 0;
    for(int i = 1; i <= n; i++)
    {
        for(int j = i; j <= n; j++)
        {
            t = (a[j] - a[i - 1]) / (j - i + 1);
            for(int k = i; k <= j; k++)
            {
                if(b[k] == t)
                {
                    ans++;
                    break;
                }
            }
        }
    }
    cout<<ans<<'\n';

    return 0;
}

标签:01,cout,int,样例,29,cin,火星人,2021,include
来源: https://blog.csdn.net/qq_45701825/article/details/113398419