2016百度之星资格赛总结

B题

/*
作者:Michaelia
题目:hdu5686
给定一个全1序列的长度,可合并任意相邻的两个1从而形成一个新的序列,求所能形成的新序列的数量。
*/
import java.util.Scanner;
import java.math.*;
public class Main {
    static BigInteger[] fib = new BigInteger[201];
    public static void fibo()
    {
        int a = 2;
        int b = 1;
        fib[1] = BigInteger.valueOf(b);
        fib[2] = BigInteger.valueOf(a);
        for (int i = 3; i < 201; i ++)
        {
            fib[i] = fib[i-1].add(fib[i-2]);
        }
        
    }
    public static void main(String[] args)
    {
        fibo();
        Scanner cin = new Scanner (System.in);
        while(cin.hasNext())
        {
            int n = cin.nextInt();
            System.out.println(fib[n]);
        }
        
    }
}:  
/*思路
由于合并后的序列只有0和1两种数字因此可认为与固定的位置无关,保留末尾的1:f[i-1] 合并末两位为2:f[i-2]
另:斐波那契数列的变化特点
a:=a+b
b:=a
参见:http://qfviolethill.blog.163.com/blog/static/114112168200911131352305/
*/

D题

/*
作者:Michaelia
题目:hdu5688
一个字符串的字符全排列均认为是同一字符串,求每一个字符串在之前被统计过多少次。
*/
#include <cstdio>
#include <iostream>
#include <string>
#include <cstring>
#include <map>
#include <algorithm>
using namespace std;
map<string,int>m;
int main()
{
    int N;
    scanf("%d",&N);
    m.clear();
    while(N--)
    {
        char ch[41];
        scanf("%s",ch);
        sort(ch,ch+strlen(ch));
        string s =ch;
        m[s]++;
        printf("%d\n",m[s]-1);
    }
}
/*思路:
利用map实现每个字符串与其对应次数的映射,注意map使用前要清空
*/

猜你喜欢

转载自blog.csdn.net/yjbuaa/article/details/81714576
今日推荐