列表

详情


NC26141. Fate Grand Order

描述

Fate Grand Order是型月社发行的角色扮演类手机游戏,是著名的氪金抽卡"垃圾"手游。

小t是该手游的忠实厨力玩家,为了抽到喜欢的角色他特地氪金买了n颗圣晶石(3颗圣晶石可以抽卡1次)。

已知有m个抽卡活动会按时间顺序在游戏中举办,每个活动都会新推出一个角色,并且告诉你这m个角色的抽取概率,而每当首次成功抽到每个角色之后他会获得一定的开心值。

小t是一个有计划的男人,在第1个活动开始前他就会想好一个抽卡计划,抽卡计划决定哪些角色抽,哪些角色不抽;

小t也是一个贫穷的男人,对于每个选择抽卡的活动,他都只会抽一次,不管是否抽到都不会选择继续再在这个活动抽卡;

小t也是一个纠结的男人,每个角色他都很纠结是否要抽,总之他想让自己尽可能开心,所以小t求助于聪明的你,他想知道什么样的计划可以让开心值的期望最大。

输入描述

第1行有2个整数n, m,圣晶石数量和活动数量(0<= n <=6000, 1<= m <=2000);

第2行有m个小数,表示每个活动角色的抽取概率p(0 <= p <= 1);

第3行有m个整数,表示每个活动角色抽到的话trx可获得的开心值x(0 <= x <= 10000)。

输出描述

输出1行长度为m的01串,表示抽卡计划,其中0表示不抽,1表示抽。

示例1

输入:

3 5
0.1 0.05 0.03 0.0001 0.9
100 100 100 100 100

输出:

00001

原站题解

上次编辑到这里,代码来自缓存 点击恢复默认模板

C++(g++ 7.5.0) 解法, 执行用时: 6ms, 内存消耗: 480K, 提交时间: 2023-04-14 23:01:46

#include<bits/stdc++.h>
#define xs first
#define ys second
using namespace std;
typedef pair<double,int> PDI;
const int N=6010;
int dp[N];
PDI e[N];
int n,m;
int ans[N];
signed main()
{
    cin>>n>>m;
    for(int i=1;i<=m;i++)cin>>e[i].xs;
    for(int i=1;i<=m;i++)
    {
        int t;
        cin>>t;
        e[i].xs*=t;
        e[i].ys=i;
    }
    sort(e+1,e+m+1,greater<PDI>());
    for(int i=1;i<=(int)min(n/3,m);i++)
        ans[e[i].ys]=1;//,cout<<e[i].ys;
    for(int i=1;i<=m;i++)cout<<ans[i];
}

C++11(clang++ 3.9) 解法, 执行用时: 7ms, 内存消耗: 504K, 提交时间: 2020-02-17 15:22:46

#include<stdio.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#include<algorithm>
using namespace std;
int n,m,x,r[2100];
double p[2100];
bool b[2100];
inline bool cmp(int a,int b)
{
	return p[a]>p[b];
}
int main()
{
	scanf("%d%d",&m,&n);
	m/=3;
	fo(i,1,n) scanf("%lf",&p[i]);
	fo(i,1,n)
	{
		scanf("%d",&x);
		p[i]*=x;
		r[i]=i;
	}
	sort(r+1,r+n+1,cmp);
	fo(i,1,m) b[r[i]]=1;
	fo(i,1,n) putchar('0'+b[i]);
	return 0;
}

C++14(g++5.4) 解法, 执行用时: 5ms, 内存消耗: 500K, 提交时间: 2019-06-08 13:13:28

#include<stdio.h>
#define fo(i,a,b) for(int i=a;i<=b;i++)
#include<algorithm>
using namespace std;
int n,m,x,r[2100];
double p[2100];
bool b[2100];
inline bool cmp(int a,int b){
	return p[a]>p[b];
}
int main(){
	scanf("%d%d",&m,&n);
	m/=3;
	fo(i,1,n) scanf("%lf",&p[i]);
	fo(i,1,n){
		scanf("%d",&x);
		p[i]*=x;
		r[i]=i;
	}
	sort(r+1,r+n+1,cmp);
	fo(i,1,m) b[r[i]]=1;
	fo(i,1,n) putchar('0'+b[i]);
	return 0;
}

上一题