本篇博客主要参照牛客网题解(https://ac.nowcoder.com/discuss/152594)
1.处女座与重修费
算法:简单模拟
思想:给你一个数组,记录小于60的个数,然后乘以400就是最后的结果
代码:
#include<bits/stdc++.h>
using namespace std;
int main(){
int n, cn = 0;
cin>>n;
for(int i = 0; i < n; i++){
int t;
cin>>t;
if(t < 60)cn++;
}
cout<<cn*400<<endl;
return 0;
}
2.处女座的砝码
算法:模拟
题意:处女座热爱做物理实验,为了实验,处女座必须要精确的知道物品的质量。处女座准备自己设计一套砝码,每一个砝码都是正整数,这套砝码必须能够精确测量出n以内所有正整数的质量,处女座想要知道至少需要多少个砝码。你可以在天平的任意一边放置砝码
思想:每个砝码可以放左边,不放和右边,很容易联进制排列即可,选择砝码如下:1,3,9,27,…选m个数最多能称出的重量为:
注意:注意精度
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long double
int main(){
LL n;
cin>>n;
LL x = 1, k = 1;
while(x < n){
x = x*3+1;
k++;
}
cout<<k<<endl;
return 0;
}
3.处女座的期末复习
算法:贪心
题意:快要期末考试了,处女座现在要复习,问能不能在规定的时间内全部都复习,如果能输出“YES”,否则输出“NO”。
思想:先按照考试时间先后的顺序进行排序,然后比较距离考试剩余的时间和复习所用的时间进行比较,如果距离考试剩余的时间大于复习所用的时间,继续判断,否之就直接跳出判断输出“NO”。
代码:
#include<bits/stdc++.h>
using namespace std;
#define LL long long
struct Node
{
LL a, b;
} tmp[100005];
bool cmp(Node A, Node B//按照考试时间先后的顺序
{
return A.b < B.b;
}
int main()
{
LL n;
cin>>n;
for(LL i = 0; i < n; i++)
{
cin>>tmp[i].a;
}
for(LL i = 0; i < n; i++)
{
cin>>tmp[i].b;
}
sort(tmp, tmp+n, cmp);//排序
LL flag = 0;
if(tmp[0].a > tmp[0].b)//如果第一场考试的时间小于复习的时间直接就判断了,
{
flag = 1;
}
else
{
LL res = tmp[0].a;//累加复习的时间
for(LL i = 1; i < n; i++)
{
LL k = tmp[i].b - i*2;//减去之前考试的时间
res += tmp[i].a;//累加复习的时间
//cout<<res<<" "<<k;
if(res > k)//复习的时间和距离考试剩余的时间
{
flag = 1;
break;
}
}
}
if(flag)cout<<"NO"<<endl;
else cout<<"YES"<<endl;
return 0;
}
4.处女座的签到题
算法:简单数学, 排序
题意:平面上有n个点,问:平面上所有三角形面积第k大的三角形的面积是多少?
思想:利用叉积求三角形的面积( S = |((x2 - x1) * (y3 - y1) - (y2 - y1) * (x3 - x1) ) / 2|),先算不及进行除2,先把这些数据存起来,然后用 stl中的nth_element找到第k大的数进行除2.
代码:
#include<stdio.h>
#include<algorithm>
#include<bits/stdc++.h>
using namespace std;
#define LL long long
struct Node{
LL x, y;
}a[105];
int main(){
int T, n, t;
LL ans;
cin>>T;
while(T--){
vector<LL>v;
cin>>n>>t;
for(int i = 0; i < n; i++){
cin>>a[i].x>>a[i].y;
}
for(int i = 0; i < n; i++){
for(int j = i+1; j < n; j++){
for(int k = j + 1; k < n; k++){
ans = abs((a[j].x-a[i].x)*(a[k].y-a[i].y)-(a[j].y-a[i].y)*(a[k].x-a[i].x));
v.push_back(ans);
}
}
}
nth_element(v.begin(), v.begin()+v.size()-t, v.end());
LL res = v[v.size()-t];
if(res%2){
printf("%lld.50\n",res / 2);
}
else {
printf("%lld.00\n",res / 2);
}
}
return 0;
}
5.处女座与cf
算法:模拟
题意:根据题意进行模拟
注意事项:不要忽略第6条的条件。
代码 :
#include<bits/stdc++.h>
#define maxn 1000
using namespace std;
map<string, int>ma;
#define LL long long
int timu[10] = {500, 1000, 1500, 2000, 2500};
int vis[maxn];
int cou[maxn][maxn], res[maxn], rec[maxn][maxn];//cou用来统计错误的次数,res保存得分情况,rec保存前一次ac的得分(如果不理解请仔细阅读第六条)
int main(){
int n, m, time;
string a, sub;
string pro, ver;
cin>>n>>m;
for(int i = 1; i <= n; i++){
cin>>a;
ma[a] = i;
}
for(int i = 0; i < m; i++){
cin>>time>>sub>>pro>>ver;
int kind = ma[sub];
int ti = pro[0] - 'A';//判断是哪一道题
if(ver == "WA" || ver == "TLE"){//
vis[kind] = 1;//证明参加比赛
if(rec[kind][ti]){//对应第六条的情况
res[kind] -= rec[kind][ti];
rec[kind][ti] = 0;
}
cou[kind][ti]++;
}
if(ver == "CE"){
if(rec[kind][ti]){//对应第六条的情况
res[kind] -= rec[kind][ti];
rec[kind][ti] = 0;
}
vis[kind] = 1;
continue;
}
if(ver == "AC"){
LL ans = max((int)(timu[ti]*0.3), timu[ti]-timu[ti]/250*time-cou[kind][ti]*50);//计算得分的方法
if(!rec[kind][ti]){//对应第六条的情况
rec[kind][ti] = ans;
res[kind] += ans;
}
else {
res[kind] = res[kind] + ans - rec[kind][ti];
rec[kind][ti] = ans;
}
cou[kind][ti]++;
vis[kind] = 1;
}
}
int cnz = ma["cnz"], rs = 0, cn = 1;
if(vis[cnz]){
int key = res[cnz];
//for(int i = 1; i <= n; i++)cout<<vis[i]<<endl;
for(int i = 1; i <= n; i++){
if(vis[i])rs++;//统计参加比赛的人数
if(res[i] > key)cn++;//统计比cnz得分高的人数
}
cout<<key<<endl;
printf("%d/%d\n",cn, rs);
}
else cout<<-1<<endl;
return 0;
}
6.处女座的测验(一)
算法:素数筛
题意:处女座进行了一场c语言的考试,要求很简单,输出2000个正整数,并且满足以下条件:
1. 任意两个数互质
2. 任意两个数x,y,满足,其中为n的因子的个数
思想:
代码:
#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000000l;
int a[maxn], vis[maxn];
void Prime(){
memset(vis, 0, sizeof(vis));
for(int i = 2; i*i <= maxn; i++ ){
if(!vis[i]){
for(int j = i*i; j <= maxn; j += i){
vis[j] = 1;
}
}
}
}
int main(){
Prime();
int cn = 1;
for(int i = 2;cn <= 4000; i++){
if(!vis[i])a[cn++] = i;
}
for(int i = 1; i <= 2000; i++){
cout<<a[i]*a[4000-i+1]<<endl;
}
return 0;
}