过题情况
第一题:100%
第二题:100%
说实话这场笔试题目比较简单,25minAK
第一题:n个朋友,每个人有金币x,有m个房子,每个房子有舒适度和价格,当前仅当这个人金币数大于房子价格时才能购买,每个人至多买一个房子,每个房子最多被一个人买,求最大舒适度
按舒适度从大到小排序,然后二分选择金币刚好>=价格的人进行购买,这里用multiset进行删除操作。
#includeusing namespace std;const int maxn=2e5+200;struct node{ int a,b;}c[maxn];bool cmp(node a, node b){ if(a.a==b.a)return a.bb.a;}int main(){ int n,m; scanf("%d%d",&n,&m); multiset st; for(int i=0;i::iterator it; for(int i=0;i
第二题:给定一个a-f组成的字符串,对其进行删除,要求所有的a在c和e之前且所有的c在e之前,所有的b在d和f之前且所有的d在f之前,求删除后满足串的最大长度
这里可以先把串拆成只由ace和bdf组成的串,之后对这两个串做处理,小技巧,把bdf也换成ace,这样就对两个ace的串进行操作。
一个小dp,dp[i][j]代表枚举到i位置,之前最后是j字母的最大方案数,a是0,c是1,e是2。
#includeusing namespace std;const int maxn=3e5+20;int dp[maxn][3];int ans;void solve(string t){ if(t=="")return; int len=t.length(); if(t[0]=='a')dp[0][0]=1; else if(t[0]=='c')dp[0][1]=1; else dp[0][2]=1; int cnt=1; for(int i=1;i>s; string s1="",s2=""; int len=s.length(); for(int i=0;i