新生排位赛第一场 dp 大数处理与模板

第一场的D题已经单独列出,C题我来不及做了,可能以后会补上



第一题

本题要注意的就是两点输出  %---------------"%%";

输出  \----------"\\"  输出  "------------------"\""


A. 学姐的桌面 2014新生暑假个人排位赛01

时间限制 1000 ms 内存限制65536 KB


题目描述

学姐在加入集训队之后,学习了使用ubuntu系统来做题,但是没有了360电脑管家,学姐再也没办法看到她的飞速电脑开机到底虐了全国多少人。作为一个电脑高手,学姐花了几分钟黑到了360的数据库拿到了全国360用户的开机时间,现在学姐想自己算算到底打败了百分之多少的人?

输入格式

输入有多组数据。首先给出数据组数 T(T10) ,下面 T 组数据,每组开头为 n(1n100000) ,360的用户数,和 t ,学姐的开机时间,接下来 n 个数字, ti 代表第 i 个用户的开机时间。其中 t ti 为非负整数且小于 109

输出格式

每组数据一行,输出学姐打败了全国百分之多少的用户,精确到小数点后两位。

输入样例

1
5 3
1 1 2 2 3

输出样例

80.00%

#include <iostream>
#include <cstdio>
#include <string.h>
#include <vector>
#include<cmath>
using namespace std;
int ats[100005];
int main()
{
    int T;
    scanf("%d", &T);
    while (T--)
    {
        int n, t;
        int cnum, ccout=0;
        float ans;
        scanf("%d %d", &n, &t);
        for (int i=0; i<n; i++)
        {
            scanf("%d", &cnum);
            if (cnum<t)
            ccout++;
        }
        ans = ccout*100.0/n;
        printf("%.2f%%\n", ans);
    }
    return 0;
}



第二题、有的人不喜欢简单题,可是我觉得简单题做对了也不容易

这道题需要仔细考虑一下,其实是有规律的,时间有个周期,想仔细了,就会好一些


B. 学姐去学车 2014新生暑假个人排位赛01

时间限制 1000 ms内存限制65536 KB

题目描述

趁着放假,学姐去学车好带学弟去兜风。但是学车真的很辛苦,每天五点半就要起床赶班车,但是学姐的教练更辛苦,他们要相同的时间到而且日日如此。于是温柔的学姐关切的问了他们的休息情况,教练告诉她,他们两个人倒班教学姐,每个教练每上 n 天班就会放一天假,如果一个教练放假,就由另一个教练来代课,一直代课到自己放假再换人。 现在学姐想知道,每一天是哪个教练给她上课。

输入格式

输入开始为数据组数 T(T10) ,接下来 T 组输入,第一行为 nm ,我们假设第一天教学姐的是教练1,而且他教学姐的前一天刚刚放完假,教练2则会在学姐上课的第 m 天放假, 1mn 以保证每天都有教练教学姐。接下一行为 q(q103) ,即询问次数,接着 q 行,每行 ti 表示学姐想问哪天的教练是谁。因为教练们非常非常厉害,而且学姐不知道自己到底会花多久学完车,你的程序要处理的 nmti 上限为 109

输出格式

对于每个询问 ti ,输出一行,1或2代表当天的教练。

输入样例

1
5 3
3
6
9
13

输出样例

2
1
2


第三题 没做,当时比赛时题目看错了,每个坐标点都是整数,所以还是有规律,至少可以分情况讨论的

C. 学姐的学弟 2014新生暑假个人排位赛01

时间限制 1000 ms 内存限制65536 KB


题目描述

学姐正在写作业,但是她写着写着就开始想学弟,走神的她就开始在纸上画圈圈。这时学弟突然出现了,好奇的学弟问学姐在做什么,惊慌之下,学姐随口说想算一下这些圆覆盖的面积为多少。学弟顿时非常仰慕学姐,但是学姐突然意识到自己不会做,为了自己能给学弟留下好印象,她来求助你帮她算出来这些圆覆盖的面积。
为了简化问题,我们假设所有圆的半径都为1。

输入格式

输入有多组数据。开头为一个整数 T(T10) ,表示数据组数,接下来T组输入,每组开头为一个整数 n(1n100) ,表示学姐画的圆的个数,接下来 n 行,每行两个整数 xi,yi ,表示圆的圆心坐标, 1xi,yi100

输出格式

输出一个数,表示面积并,精确到小数点后五位。

输入样例

1
2
1 1
2 1

输出样例

5.05482



第四题 详见单独解析



第五题   这道题是一道好题,使用了dp的思想,并且用运用到了大数的知识

//a[i][j], i 为数字个数,j为有不等关系的数字种类可取从1到i,1为全部相等,i为全部不等

 //i个不同物品  分成j堆 的组合情况的种数,因为是大数,所以用字符串表示或者用java

  //a[i][j]=a[i-1][j-1]*j+a[i-1][j]*j



E. 数的关系 2014新生暑假个人排位赛01

时间限制 5000 ms 内存限制65536 KB


题目描述

用关系“<”和“=”将3个数A、B和C依序排列时有13种不同的序关系:
ABCABCABCABCACBACBBAC

BACBCABCACABCABCBA

现在输入数字的个数,要求你给出上述关系的数目。

数的个数不大于100
 

输入格式

多组数据,EOF结束

每行一个输入

输出格式

对于每个输入,输出一行,即对应答案

输入样例

3

输出样例

13
#include <sstream>
#include <iostream>
#include <cstdio>
#include <string.h>
#include <cctype>
#include <cstdlib>
#include <cmath>
#include <algorithm>
 
using namespace std;
inline int compare(string str1, string str2)
{
    if(str1.size() > str2.size()) //长度长的整数大于长度小的整数
        return 1;
    else if(str1.size() < str2.size())
        return -1;
    else
        return str1.compare(str2); //若长度相等,从头到尾按位比较,compare函数:相等返回0,大于返回1,小于返回-1
}
//高精度加法//str2.erase(0, 1));erase(pos,n); 删除从pos开始的n个字符,比如erase(0,1)就是删除第一个字符
string ADD_INT(string str1, string str2)
{
    string str;
    //把两个整数对齐,短整数前面加0补齐
    string::size_type l1, l2;
    int i;
    l1 = str1.size(); l2 = str2.size();
    if(l1 < l2)
    {
        for(i = 1; i <= l2 - l1; i++)
            str1 = "0" + str1;
    }
    else
    {
        for(i = 1; i <= l1 - l2; i++)
            str2 = "0" + str2;
    }
    int int1 = 0, int2 = 0; //int2 记录进位
    for(i = str1.size() - 1; i >= 0; i--)
    {
        int1 = (int(str1[i]) - 48 + int(str2[i]) - 48 + int2) % 10;  //48 为 '0' 的ASCII 码
        int2 = (int(str1[i]) - 48 + int(str2[i]) - 48 +int2) / 10;
        str = char(int1 + 48) + str;
    }
    if(int2 != 0) str = char(int2 + 48) + str;
 
    return str;
}
 
//高精度乘法
string MULTIPLY_INT(string str1, string str2)
{
     int sign = 1; //sign 为符号位
     string str;
     if(str1[0] == '-') {
           sign *= -1;
           str1 = str1.erase(0, 1);
     }
     if(str2[0] == '-') {
           sign *= -1;
           str2 = str2.erase(0, 1);
     }
     int i, j;
     string::size_type l1, l2;
     l1 = str1.size(); l2 = str2.size();
     for(i = l2 - 1; i >= 0; i --) {  //实现手工乘法
           string tempstr;
           int int1 = 0, int2 = 0, int3 = int(str2[i]) - 48;
           if(int3 != 0) {
                  for(j = 1; j <= (int)(l2 - 1 - i); j++)
                        tempstr = "0" + tempstr;
                  for(j = l1 - 1; j >= 0; j--) {
                        int1 = (int3 * (int(str1[j]) - 48) + int2) % 10;
                        int2 = (int3 * (int(str1[j]) - 48) + int2) / 10;
                        tempstr = char(int1 + 48) + tempstr;
                  }
                  if(int2 != 0) tempstr = char(int2 + 48) + tempstr;
           }
           str = ADD_INT(str, tempstr);
     }
     //去除结果中的前导0
     str.erase(0, str.find_first_not_of('0'));
     if(str.empty()) str = "0";
     if((sign == -1) && (str[0] != '0'))
           str = "-" + str;
     return str;
}
 
int main()
{
    int n;
    string sum[300], a[105][105];
    //a[i][j],i为数字个数,j为有不等关系的数字个数可取从1到i,
    //i个不同数有j个有不等关系的组合情况的种数,用字符串表示
    //a[i][j]=a[i-1][j-1]*j+a[i-1][j]*j
    string temp;
    temp = "0";
    sum[0] = "0";
    sum[1] = "1";
    a[1][1] = "1";
    for(int i=2;i<=100;i++)
    {
        for(int j=1; j<=i; j++)
        {
            string c = ADD_INT(a[i-1][j-1], a[i-1][j]);
            string d;
            ostringstream oss;
            oss<<j;
            d = oss.str();
            a[i][j] = MULTIPLY_INT(c, d);
            //cout << i << " " << j << " a[i][j] " << a[i][j] << endl;
            sum[i] = ADD_INT(sum[i], a[i][j]);
        }
        //cout << i << " sum[i] " << sum[i] << endl;
    }
    while(scanf("%d",&n)!=EOF)
    {
        cout << sum[n] << endl;
        //printf("%s\n", sum[n]);
    }
    return 0;
}


  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值