现在的位置: 首页 > 综合 > 正文

组队赛130827 – from lanshui_Yang

2019年01月07日 ⁄ 综合 ⁄ 共 1733字 ⁄ 字号 评论关闭

A. Hailstone HOTPO

这是一道水题,直接写就ok,直接上代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std ;
const int MAXN = 2005 ;
int n ;
int main()
{
    int T ;
    scanf("%d" , &T) ;
    while (T --)
    {
        int t , n ;
        scanf("%d%d" , &t , &n) ;
        int MAX = n ;
        int tmp = n ;
        while (tmp != 1)
        {
            if(tmp % 2 == 0)
            {
                tmp /= 2 ;
            }
            else
            {
                tmp = tmp * 3 + 1 ;
                if(tmp > MAX)
                MAX = tmp ;
            }
        }
        printf("%d %d\n" , t , MAX) ;
    }
    return 0 ;
}

C. Pen Counts
    题目大意:直接抽象一下,给你一个长度为n的绳子,让你围成一个三角形,要求:
    1、三角形的边长必须为整数
    2、能够由另一三角形A 旋转得到 三角形B , 则三角形A、B算作一个三角形
    解题思路:直接枚举,思考后易得出:考虑由同样的三条边长 a,b,c 能围成几个不同的三角形:
    1、当a,b,c组成的三角形是等腰三角形或者等边三角形,那么只能围成 1 个不同的三角形。
    2、当a != b 且 b != c 且 a != c 时 ,即围成的是一般三角形时,那么能围成 2 个不同的三角形。
代码如下:
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std ;
void init()
{
    int t ;
    scanf("%d" , &t) ;
    int n ;
    scanf("%d" , &n) ;
    int ans = 0 ;
    int i ;
    int tmp1 , tmp2 , tmp3 ;
    for(i = 1 ; i <= n ; i ++)
    {
        tmp1 = (n - i) / 2 ;
        tmp2 = n - i - tmp1 ;
        while (tmp1 >= i)
        {
            if(i + tmp1 > tmp2)
            {
                if(i != tmp1 && tmp1 != tmp2 && i != tmp2)
                ans += 2 ;
                else
                ans ++ ;
                tmp1 -- ;
                tmp2 ++ ;
            }
            else
            break ;
        }
    }
    printf("%d %d\n" , t , ans) ;
}
int main()
{
    int T ;
    scanf("%d" , &T) ;
    while (T --)
    {
        init() ;
    }
    return 0 ;
}



J. Mystery

        题目大意:此题是一道找规律题,给你一个字符串s,然后给你 n 个数a1 , a2 , …… , an ,让你输出一个字符串。
        解题思路:先求出字符串s的长度len , 定义一个变量tmp = 0 ,读到数a1 时 , tmp = tmp + a1 ,此时若tmp > 0,则要输出的第一个字符即为s[ tmp % len ] ; 若 tmp < 0 ,则进行tmp = tmp + len 直到tmp >= 0 为止 ,输出s[ tmp ] ;接下来读到数a2 , 则tmp = tmp + a2 ,输出字符的方法同上。
        请看代码:
#include<iostream>
#include<string>
#include<algorithm>
#include<cstring>
#include<cmath>
#include<cstdio>
using namespace std ;
const int MAXN = 2005 ;
char s[MAXN] ;
int main()
{
    int n ;
    scanf("%d" , &n) ;
    while (n --)
    {
        int t ;
        scanf("%d" , &t) ;
        getchar() ;
        gets(s) ;
        int len = strlen(s) ;
        int m ;
        scanf("%d" , &m) ;
        printf("%d ", t) ;
        int tmp = 0 ;
        int i ;
        for(i = 0 ; i < m ; i ++)
        {
            int tn ;
            scanf("%d" , &tn) ;
            tmp += tn ;
            if(tmp < 0)
            {
                int k = tmp ;
                while (k < 0)
                {
                    k += len ;
                }
                printf("%c" , s[k]) ;
            }
            else
            {
                printf("%c" , s[tmp % len]) ;
            }
        }
        puts("") ;
    }
    return 0 ;
}


  


抱歉!评论已关闭.