长春理工大学第十四届程序设计竞赛(重现赛)I

I.Fate Grand Order

题目链接:https://ac.nowcoder.com/acm/contest/912/I

题目:

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

思路:

惭愧,这道题一开始我想的竟然还铤复杂的,错还不知道那儿错了,case 通过率为98%,总有一组数据过不去,气死人,后来换了一种思想:

直接结构体重载排序,顺便结构体记录一下下标,再用一个数组book初始化为0,要变成1的话,book[该下标]=1,利用book来输出01字符串。

#include<bits/stdc++.h>
using namespace std;
typedef  long long ll;
const int maxn=2e5+10;
int book[maxn]={0};
struct happy{
    int cun;
   double pin;
   int value;
   double last;
   bool operator<(happy const& other)const{
       return last>other.last;
   }

}happy[maxn];
int main()
{
    int n,m;
    cin>>n>>m;
    for(int i=0;i<m;i++)
        cin>>happy[i].pin,happy[i].cun=i;
    for(int i=0;i<m;i++)
        cin>>happy[i].value,happy[i].last=happy[i].pin*happy[i].value;
    sort(happy,happy+m);
    int time=n/3;
    for(int i=0;i<time;i++)
    {
        book[happy[i].cun]=1;
    }
    for(int i=0;i<m;i++)
    {
        if(book[i]==1)
            cout<<1;
        else
            cout<<0;
    }
    return 0;
}
 
原文地址:https://www.cnblogs.com/Vampire6/p/10997215.html