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求助于聪明的你,他想知道什么样的计划可以让开心值的期望最大。
小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; }