組隊賽 130906 - from lanshui_Yang

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 ;
}



發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章