第一场的D题已经单独列出,C题我来不及做了,可能以后会补上
第一题
本题要注意的就是两点输出 %---------------"%%";
输出 \----------"\\" 输出 "------------------"\""
A. 学姐的桌面 2014新生暑假个人排位赛01
题目描述
学姐在加入集训队之后,学习了使用ubuntu系统来做题,但是没有了360电脑管家,学姐再也没办法看到她的飞速电脑开机到底虐了全国多少人。作为一个电脑高手,学姐花了几分钟黑到了360的数据库拿到了全国360用户的开机时间,现在学姐想自己算算到底打败了百分之多少的人?
输入格式
输入有多组数据。首先给出数据组数 T(T≤10) ,下面 T 组数据,每组开头为 n(1≤n≤100000) ,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
题目描述
趁着放假,学姐去学车好带学弟去兜风。但是学车真的很辛苦,每天五点半就要起床赶班车,但是学姐的教练更辛苦,他们要相同的时间到而且日日如此。于是温柔的学姐关切的问了他们的休息情况,教练告诉她,他们两个人倒班教学姐,每个教练每上 n 天班就会放一天假,如果一个教练放假,就由另一个教练来代课,一直代课到自己放假再换人。 现在学姐想知道,每一天是哪个教练给她上课。
输入格式
输入开始为数据组数 T(T≤10) ,接下来 T 组输入,第一行为 n,m ,我们假设第一天教学姐的是教练1,而且他教学姐的前一天刚刚放完假,教练2则会在学姐上课的第 m 天放假, 1≤m≤n 以保证每天都有教练教学姐。接下一行为 q(q≤103) ,即询问次数,接着 q 行,每行 ti 表示学姐想问哪天的教练是谁。因为教练们非常非常厉害,而且学姐不知道自己到底会花多久学完车,你的程序要处理的 n,m,ti 上限为 109 。
输出格式
对于每个询问 ti ,输出一行,1或2代表当天的教练。
输入样例
1
5 3
3
6
9
13
输出样例
2
1
2
第三题 没做,当时比赛时题目看错了,每个坐标点都是整数,所以还是有规律,至少可以分情况讨论的
C. 学姐的学弟 2014新生暑假个人排位赛01
题目描述
学姐正在写作业,但是她写着写着就开始想学弟,走神的她就开始在纸上画圈圈。这时学弟突然出现了,好奇的学弟问学姐在做什么,惊慌之下,学姐随口说想算一下这些圆覆盖的面积为多少。学弟顿时非常仰慕学姐,但是学姐突然意识到自己不会做,为了自己能给学弟留下好印象,她来求助你帮她算出来这些圆覆盖的面积。
为了简化问题,我们假设所有圆的半径都为1。
输入格式
输入有多组数据。开头为一个整数 T(T≤10) ,表示数据组数,接下来T组输入,每组开头为一个整数 n(1≤n≤100) ,表示学姐画的圆的个数,接下来 n 行,每行两个整数 xi,yi ,表示圆的圆心坐标, 1≤xi,yi≤100 。
输出格式
输出一个数,表示面积并,精确到小数点后五位。
输入样例
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
题目描述
用关系“<”和“=”将3个数A、B和C依序排列时有13种不同的序关系:
A=B=C,A=B<C,A<B=C,A<B<C,A<C<B,A=C<B,B<A=C,
B<A<C,B<C<A,B=C<A,C<A=B,C<A<B,C<B<A 。
现在输入数字的个数,要求你给出上述关系的数目。
数的个数不大于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; }