小红书算法题【20240502】

ps.第一题网上我看也有,就赋值粘贴了一下题目。

题目描述:

塔子哥是一个卡牌游戏主播。他经常去网络上发布关于游戏的卡牌研究攻略。游戏中有一张牌叫做碾压墙,可以消灭敌方最左边和最右边的随从,另一张牌做致命射击,可以随机消灭一个敌方随从。 如果塔子哥使用两张致命射击恰好消灭了敌方最左边和最右边的随从(恰好造成了一张碾压墙的效果),就会有人在评论区发布“碾压墙”,注意:两张致命射击的结算有先后顺序,即两张致命射击不会消灭同一个敌方随从。 现在有个敌方随从,塔子哥想知道她使用两张致命射击后,恰好造成一张碾压墙的效果的概率是多少,你的答案请四舍五入保留10位小数。

输入描述
第一行一个正整数n。

输出描述
一个保留10位小数的答案。

#include<bits/stdc++.h>
using namespace std;
int main(){
	int n;
	cin>>n;
	double u = (double) n * (double) (n-1) / (double)2;
	// 自动有四舍五入的效果
	cout<<fixed<<setprecision(10)<<1/u<<endl;
	// 或者
	//print("%.10f",1/u);
	return 0;
}
import java.utils.*
import java.math.*
class Main{
	public static void main(String[] args){
		Scanner sc = new Scanner();
		Integer n = sc.nextInt();
		BigDecimal mult1 = new BigDecimal(n);
		BigDecimal mult2 = new BigDecimal(n-1);
		BigDecimal val = mult1.multiple(mult2)
		.divide(new BigDecimal(2),10,RoundingMode.HALF_UP);
		System.out.println(val.toString());
	}
}

第二题:自己记了的大概,又因为那段时间刚好在外面,所以已经记不清了哈哈哈

题目
小红共记了n篇笔记,且其第i篇笔记的点赞数为a,评论数为b,她想要选择其中的k篇作为精选合集,从而使得精选合集的优秀程度最大,其中,
优秀程度 = k篇笔记的点赞数之和 * k篇笔记中评论的最小值。那么他应该选择哪k篇笔记呢?
输入描述
第一行分别输入n,k
后面n行分别输入各个笔记的点赞数a和评论数b
输出描述
输出精选合集的优秀程度,以及其精选合集的笔记分别分哪些篇
样例:
输入

5 3
3 4
2 5
4 2
6 1
4 3

输出

27
1 0 4

#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
struct CREATIONS{
  int index;
  int like;
  int comment;
}all[N];
struct GREATE{
  int index;
  int like;
  bool operator <(GREATE a) const {return like < a.like;}
  bool operator >(GREATE a) const {return like > a.like;}
};
bool cmp(CREATIONS const a,CREATIONS const b){
  if(a.comment == b.comment)
    return a.like > b.like;
  else
    return a.comment > b.comment;
}
int main(){
  int n,k;
  priority_queue<GREATE,vector<GREATE>,greater<GREATE>> excellents;
  cin>>n>>k;
  for(int i = 0;i<n;i++){
    cin>>all[i].like>>all[i].comment;
    all[i].index = i;
  }
  sort(all,all+n,cmp);
  int sumlike = 0;
  int minCom = all[k-1].comment; 
  for(int i = 0 ; i < k ; i++){
    GREATE tmp;
    tmp.index = all[i].index;
    tmp.like = all[i].like;
    sumlike += tmp.like;
    excellents.push(tmp);
  }
  int goal = sumlike * minCom;
  for(int i = k;i < n;i++){
    GREATE t = excellents.top();
    sumlike -= t.like;
    minCom = all[i].comment;
    sumlike += all[i].like;
    int tmpGoal = sumlike * minCom;
    if(tmpGoal > goal){
      excellents.pop();
      GREATE addt;
      addt.index = all[i].index;
      addt.like = all[i].like;
      excellents.push(addt);
      goal = tmpGoal;
    }
  }
  cout<<goal<<endl;
  while(!excellents.empty()){
    cout<<excellents.top().index<<" ";
    excellents.pop();
  }
  return 0;
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值