zoukankan      html  css  js  c++  java
  • AtCoder Beginner Contest 089完整题解

    A - Grouping 2


    Time limit : 2sec / Memory limit : 256MB

    Score : 100 points

    Problem Statement

    There are N students in a school.

    We will divide these students into some groups, and in each group they will discuss some themes.

    You think that groups consisting of two or less students cannot have an effective discussion, so you want to have as many groups consisting of three or more students as possible.

    Divide the students so that the number of groups consisting of three or more students is maximized.

    Constraints

    • 1≤N≤1000
    • All input values are integers.

    Input

    Input is given from Standard Input in the following format:

    N
    

    Output

    If you can form at most x groups consisting of three or more students, print x.


    Sample Input 1

    Copy
    8
    

    Sample Output 1

    Copy
    2
    

    For example, you can form a group of three students and another of five students.


    Sample Input 2

    Copy
    2
    

    Sample Output 2

    Copy
    0
    

    Sometimes you cannot form any group consisting of three or more students, regardless of how you divide the students.


    Sample Input 3

    Copy
    9
    

    Sample Output 3

    Copy
    3
    

    题目大意:给定N个人,要求尽可能划分为3个或3个人以上的小组。求人数大于等于3的小组个数。

    题解:贪心的考虑,把所有人划分为3个人的小组,最后一个小组人数可能不足3个人,如果存在不满足条件的一组,就划分到最后一组里,形成较大的一组。答案就是$lfloorfrac N3 floor$.

    #include <cstdio >
    int N;
    int main()
    {
        scanf("%d",&N);
        printf("%d
    ",N/3);
    }
    

      

    B - Hina Arare


    Time limit : 2sec / Memory limit : 256MB

    Score : 200 points

    Problem Statement

    In Japan, people make offerings called hina arare, colorful crackers, on March 3.

    We have a bag that contains N hina arare. (From here, we call them arare.)

    It is known that the bag either contains arare in three colors: pink, white and green, or contains arare in four colors: pink, white, green and yellow.

    We have taken out the arare in the bag one by one, and the color of the i-th arare was Si, where colors are represented as follows - pink: P, white: W, green: G, yellow: Y.

    If the number of colors of the arare in the bag was three, print Three; if the number of colors was four, print Four.

    Constraints

    • 1≤N≤100
    • Si is PWG or Y.
    • There always exist ij and k such that Si=PSj=W and Sk=G.

    Input

    Input is given from Standard Input in the following format:

    N
    S1 S2  SN
    

    Output

    If the number of colors of the arare in the bag was three, print Three; if the number of colors was four, print Four.


    Sample Input 1

    Copy
    6
    G W Y P Y W
    

    Sample Output 1

    Copy
    Four
    

    The bag contained arare in four colors, so you should print Four.


    Sample Input 2

    Copy
    9
    G W W G P W P G G
    

    Sample Output 2

    Copy
    Three
    

    The bag contained arare in three colors, so you should print Three.


    Sample Input 3

    Copy
    8
    P Y W G Y W Y Y
    

    Sample Output 3

    Copy
    Four
    

    Submit

    题目大意:给定一个颜色序列,统计序列中颜色种数。

    题解:gg。

    #include<cstdio>
    #include<cctype>
    #include<set>
    using namespace std;
    int n;
    set<char> s;
    char ch[2333];
    int main()
    {
    	scanf("%d",&n);
    	for(int i=0;i<n;i++)
    	{
    		scanf("%s",ch);
    		s.insert(ch[0]);
    	}
    	if(s.size()==3)puts("Three");
    	else puts("Four");
    	return 0;
    }
    

    其实把题目读漏了,只需要颜色序列只有两种,选择一个特征颜色判断一下就行了。

    #include<cstdio>
    int N;
    char c;
    int main()
    {
    	scanf("%d",&N);
    	bool flag=false;
    	for(int i=0; i<N; i++)
    	{
    		scanf("%c",&c);
    		if(c=='Y')flag=true;
    	}
    	if(flag)puts("Four");
    	else puts("Three");
    	return 0;
    }
    

    C - March


    Time limit : 2sec / Memory limit : 256MB

    Score : 300 points

    Problem Statement

    There are N people. The name of the i-th person is Si.

    We would like to choose three people so that the following conditions are met:

    • The name of every chosen person begins with MARC or H.
    • There are no multiple people whose names begin with the same letter.

    How many such ways are there to choose three people, disregarding order?

    Note that the answer may not fit into a 32-bit integer type.

    Constraints

    • 1≤N≤105
    • Si consists of uppercase English letters.
    • 1≤|Si|≤10
    • SiSj(ij)

    Input

    Input is given from Standard Input in the following format:

    N
    S1
    :
    SN
    

    Output

    If there are x ways to choose three people so that the given conditions are met, print x.


    Sample Input 1

    Copy
    5
    MASHIKE
    RUMOI
    OBIRA
    HABORO
    HOROKANAI
    

    Sample Output 1

    Copy
    2
    

    We can choose three people with the following names:

    • MASHIKERUMOIHABORO

    • MASHIKERUMOIHOROKANAI

    Thus, we have two ways.


    Sample Input 2

    Copy
    4
    ZZ
    ZZZ
    Z
    ZZZZZZZZZZ
    

    Sample Output 2

    Copy
    0
    

    Note that there may be no ways to choose three people so that the given conditions are met.


    Sample Input 3

    Copy
    5
    CHOKUDAI
    RNG
    MAKOTO
    AOKI
    RINGO
    

    Sample Output 3

    Copy
    7
    

    Submit

    题目大意:给定一堆字符串,从中选出以‘M’,‘A’,‘R’,‘C’或‘H’开头的字符串形成一个三个字符串组成的排列,求出排列种数。

    题解:由于数据范围很小,可以暴力枚举10种排列的方案数,做个积就行了。

    #include<iostream>
    using namespace std;
    long long n,sum1,sum2,sum3,sum4,sum5,ans;
    char a[100006][200];
    int main()
    {
    	cin>>n;
    	for(int i=1;i<=n;i++)cin>>a[i];
    	for(int i=1;i<=n;i++)
    	{
    		if(a[i][0]=='M')sum1++;
    		if(a[i][0]=='A')sum2++;
    		if(a[i][0]=='R')sum3++;
    		if(a[i][0]=='C')sum4++;
    		if(a[i][0]=='H')sum5++;
    	}
    	ans+=sum1*sum2*sum3;
    	ans+=sum1*sum2*sum4;
    	ans+=sum1*sum2*sum5;
    	ans+=sum1*sum3*sum4;
    	ans+=sum1*sum3*sum5;
    	ans+=sum1*sum4*sum5;
    	ans+=sum2*sum3*sum4;
    	ans+=sum2*sum3*sum5;
    	ans+=sum2*sum4*sum5;
    	ans+=sum3*sum4*sum5;
    	cout<<ans<<endl;
    	return 0;
    }
    

      

    D - Practical Skill Test


    Time limit : 2sec / Memory limit : 256MB

    Score : 400 points

    Problem Statement

    We have a grid with H rows and W columns. The square at the i-th row and the j-th column will be called Square (i,j).

    The integers from 1 through H×W are written throughout the grid, and the integer written in Square (i,j) is Ai,j.

    You, a magical girl, can teleport a piece placed on Square (i,j) to Square (x,y) by consuming |xi|+|yj| magic points.

    You now have to take Q practical tests of your ability as a magical girl.

    The i-th test will be conducted as follows:

    • Initially, a piece is placed on the square where the integer Li is written.

    • Let x be the integer written in the square occupied by the piece. Repeatedly move the piece to the square where the integer x+D is written, as long as x is not Ri. The test ends when x=Ri.

    • Here, it is guaranteed that RiLi is a multiple of D.

    For each test, find the sum of magic points consumed during that test.

    Constraints

    • 1≤H,W≤300
    • 1≤DH×W
    • 1≤Ai,jH×W
    • Ai,jAx,y((i,j)≠(x,y))
    • 1≤Q≤105
    • 1≤LiRiH×W
    • (RiLi) is a multiple of D.

    Input

    Input is given from Standard Input in the following format:

    H W D
    A1,1 A1,2  A1,W
    :
    AH,1 AH,2  AH,W
    Q
    L1 R1
    :
    LQ RQ
    

    Output

    For each test, print the sum of magic points consumed during that test.

    Output should be in the order the tests are conducted.


    Sample Input 1

    Copy
    3 3 2
    1 4 3
    2 5 7
    8 9 6
    1
    4 8
    

    Sample Output 1

    Copy
    5
    
    • 4 is written in Square (1,2).

    • 6 is written in Square (3,3).

    • 8 is written in Square (3,1).

    Thus, the sum of magic points consumed during the first test is (|3−1|+|3−2|)+(|3−3|+|1−3|)=5.


    Sample Input 2

    Copy
    4 2 3
    3 7
    1 4
    5 2
    6 8
    2
    2 2
    2 2
    

    Sample Output 2

    Copy
    0
    0
    

    Note that there may be a test where the piece is not moved at all, and there may be multiple identical tests.


    Sample Input 3

    Copy
    5 5 4
    13 25 7 15 17
    16 22 20 2 9
    14 11 12 1 19
    10 6 23 8 18
    3 21 5 24 4
    3
    13 13
    2 10
    13 13
    

    Sample Output 3

    Copy
    0
    5
    0

    题目大意:

    给定一个300*300的矩阵,10^5组询问,每次询问跳到指定有指定数字的格子的代价。
    跳跃方式:
    开始,在有给定数字的格子上。
    令x是格子上出现的数字,跳到写有x+d的格子上,如果没有到达给定的格子R,就继续跳跃,直到跳到给定的格子。
    代价即两格子之间的曼哈顿距离。

    题解:由于询问次数很大,所以直接暴力模拟肯定会TLE。如何处理?注意到D是固定的,预处理出一个dp数组,dp[i]表示跳到编号为i的格子需要的最小魔法点数。

    很容易得出DP方程:dp[i]=dp[i-D]+abs(x[i]-x[i-D])+abs(y[i]-y[i-D])。

    状态的转移是从这个格子的前一个格子转移而来。

    #include <cstdio >
    #define abs(x) ((x>0)?x:(-(x)))
    int H,W,D,A;
    int Q,L,R;
    int px[90001],py[90001];
    int d[90001];
    int main()
    {
    	scanf("%d%d%d",&H,&W,&D);
    	for(int i=0; i<H; i++)
    	{
    		for(int j=0; j<W; j++)
    		{
    			scanf("%d",&A);
    			px[A]=i,py[A]=j;
    		}
    	}
    	for(int i=D+1; i<=H*W; i++)
    		d[i]=d[i-D]+abs(px[i]-px[i-D])+abs(py[i]-py[i-D]);
    	scanf("%d",&Q);
    	while(Q--)
    	{
    		scanf("%d%d",&L,&R);
    		printf("%d
    ",d[R]-d[L]);
    	}
    }
    

      

  • 相关阅读:
    Python向上取整,向下取整以及四舍五入函数
    Python字符串操作之字符串分割与组合
    python第四十七课——类属性和函数属性
    python第四十六课——函数重写
    LR进行接口测试
    Linux安装rpc监控系统资源
    本文将详细介绍oracle 10g OEM常规错误
    windows下卸载oracle11g
    Vi编辑器修改文件.bash_profile可解决backspace出现乱码问题,rlwrap 的安装。
    vim 编辑器常用命令
  • 原文地址:https://www.cnblogs.com/TheRoadToAu/p/AtCoder-ABC-089.html
Copyright © 2011-2022 走看看