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

组队赛 130906 – from lanshui_Yang

2018年02月21日 ⁄ 综合 ⁄ 共 2985字 ⁄ 字号 评论关闭

A.

水题。。。代码如下:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std ;
char s[11111] ;
void init()
{
    int t ;
    scanf("%d" , &t) ;
    int n ;
    cin >> n ;
    scanf("%s" , s) ;
    int len = strlen(s) ;
    int i ;
    cout << t <<" " ;
    for(i = 0 ; i < len ; i ++)
    {
        int j ;
        for(j = 0 ; j < n ; j ++)
        {
            printf("%c" , s[i]) ;
        }
    }
    puts("") ;
}
int main()
{
    int T ;
    cin >> T ;
    while (T --)
    {
        init() ;
    }
    return 0 ;
}

B.

      找规律题,找出的规律是:第n行(n 从 0 开始)第一个数字是1,第二个数字是n , 第三个数字是n + (n - 3) ,第四个数字是n + (n - 5) , 第五个数字是n - (n - 7) ,这个过程中要保证(n - x)  >  0 (其中 x 为 3, 5 ,7 …… )。这计算出的只是每一行的左半部分,由于右半部分与左半部分是对称的,转换一下就可以得到了。

      代码如下: 

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<cstdio>
using namespace std ;
const int MAXN = 50005 ;
long long R[MAXN] ;
void init()
{
    int t ;
    scanf("%d" , &t) ;
    int n , m ;
    scanf("%d%d" , &n , &m) ;
    R[0] = 1 ;
    R[1] = n ;
    long long tmp = n - 1 ;
    int i = 2 ;
    while (tmp > 0)  // 规律部分
    {
        tmp -= 2 ;
        R[i] = R[i - 1] + tmp ;
        i ++ ;
    }
    cout << t <<" " ;
    if(n % 2 == 0)
    {
        if(m > n / 2 + 1)
        {
            m = n - m ;
        }
        cout << R[m] << endl ;
    }
    else
    {
        if(m > n / 2)
        {
            m = n - m ;
        }
        cout << R[m] << endl ;
    }
}
int main()
{
    int T ;
    scanf("%d" , &T) ;
    while (T --)
    {
        init() ;
    }
    return 0 ;
}

      D.

     题目大意:抽象一下就是把几个二进制串拼接起来,然后转化为double行输出。

     解题思路:这道题如果自己用字符串模拟也是可以的,但比较复杂。较好的方法是用 “位运算” ,同时要注意补码的转换问题和如何去掉答案末尾的0.

     请看代码:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<queue>
#include<cstdio>
using namespace std ;
const int MAXN = 100 ;
char s[MAXN] = {"PQWERTYUIOJ#SZK*?F@D!HNM&LXGABCV"} ;
int su[MAXN] ;
char res[111] ;
int len ;
void print()  // 输出答案,主要是去掉末尾的0
{
    int lenr = strlen(res) ;
    int i ;
    int pan = 0 ;
    for(i = lenr - 1 ; i >= 0 ; i --)
    {
       if(res[i] >= '1' && res[i] <= '9')
       {
            res[i + 1] = '\0' ;
            break ;
        }
        if(res[i - 1] == '.'){
            res[i + 1] = '\0' ;
            break ;
        }
    }
    cout << res << endl ;
}
void chu()  // 初始化第一个符号所代表的序列
{
    len = strlen(s) ;
    int i ;
    for(i = 0 ; i < len ; i ++)
    {
        su[i] = i ;
    }
}
char xn , xm ;
int n ;
int m ;
int x ;
void init()
{
    memset(res , 0 , sizeof(res)) ;
    int t ;
    scanf("%d" , &t) ;
    printf("%d " , t) ;
    cin >> xn ;
    scanf("%d" , &x) ;
    cin >> xm ;
    if(xm == 'F')
        m = 0 ;
    else
        m = 1 ;
}
void solve()
{
    double ans = 0 ;
    int tmp ;
    int i ;
    for(i = 0 ; i < len ; i ++)
    {
        if(s[i] == xn)
        {
            tmp = su[i] ;
            break ;
        }
    }
    tmp = tmp << 12 ;
    x = x << 1 ;
    tmp += (x + m) ;
    int tp ;
    int t1 ;
    double q = pow(2 , -16) ;
    for(i = 1 ; i <= 16 ; i ++)
    {
        tp = 1 << (i - 1) ;
        t1 = tmp ;
        t1 &= tp ;
        if(t1 > 0)
            ans += q ;
        q *= 2.0 ;
    }
    tp = 1 << 16 ;  // 判断符号位
    t1 = tmp ;
    t1 &= tp ;
    if(t1 > 0)
    {
        if(ans == 0)
        {
            ans = 1 ;
            sprintf(res, "-%.16f\n" , ans) ; // 将答案转换为字符串,主要是为了去掉末尾的0
            print() ;
        }
        else
        {
            ans = 1 - ans ;  // 补码的转换
            sprintf(res, "-%.16f\n" , ans) ;
            print() ;
        }
    }
    else
    {
        sprintf(res,"%.16f\n" , ans) ;
        print() ;
    }
}
int main()
{
    chu() ;
    int T ;
    scanf("%d" , &T) ;
    while (T --)
    {
        init() ;
        solve() ;
    }
    return 0 ;
}

  

    H.

    是一道找规律求组合数的问题。

    代码如下:

#include<iostream>
#include<cstring>
#include<string>
#include<algorithm>
#include<vector>
#include<cmath>
#include<cstdio>
#include<queue>
using namespace std ;
const int MAXN = 21 ;
int n ;
int k ;
long long jie[MAXN] ;
void chu()
{
    long long i ;
    jie[0] = 1 ;
    for(i = 1 ; i < MAXN ; i ++)
    {
        jie[i] = i * jie[i - 1] ;
    }
}
void init()
{
    int t ;
    scanf("%d" , &t) ;
    printf("%d " , t) ;
    scanf("%d%d" , &n , &k) ;
}
void solve()
{
    long long ans = 0 ;
    if(k == 1)
    {
        ans = jie[n - 1] ;
    }
    else
    {
        long long tmp = 0 ;
        long long m = 0 ;
        int i ;
        ans = jie[m + 1] * jie[n - m - 2] ;  // 核心代码
        for(i = 1 ; i <= k - 2 ; i ++)
        {
            m = i ;
            tmp = jie[k - 2] / jie[m] / jie[k - 2 - m] ;
            ans += tmp * jie[m + 1] * jie[n - m - 2] ;
        }
    }
    cout << ans << endl ;
}
int main()
{
    chu() ;
    int T ;
    scanf("%d" , &T) ;
    while (T --)
    {
        init() ;
        solve() ;
    }
    return 0 ;
}


抱歉!评论已关闭.