感想:过个年10多天没刷题,一开始连签到题都不是很顺利,而且一开始作死开了D题,结果全场有D,F两道题没人过,结果排在了3题尾,哭死。但这不是理由,最重要的原因是自己菜,而且寒假第一阶段所学的知识点还不会运用,因为寒假第一阶段是专题训练,每道题都有说考察什么知识点,而且这次排位赛E题考二分,我却想不到二分做,I题考优先队列,我却一直卡在那里,一直想模拟过程,B题考DP,我却一直想贪心,根本没有想到状态转移,C题却嫌麻烦,不想模拟,所以放弃。最终只做完三道签到题,被rank1差点7题的lyr大佬无情的锤爆
总而言之,题还是刷的比较少,不懂得系统的总结加以应用,好多只知道知识点,却不会应用到题目中去
【题目链接】:http://codeforces.com/group/NVaJtLaLjS/contest/238166
A.The Bucket List(签到题)
题意:给定N只奶牛,每只奶牛开始挤奶时间以及结束时间分别为s与t,以及每只奶牛在挤奶时间需要b只桶,问最多需要多少只桶?
思路:(由于题目数据1<= s,t <=1000,且保证在某个时刻只有一只奶牛开始挤奶或者结束挤奶,所以直接暴力就行)
复杂度O(1000)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[1005],b[1005];
int main()
{
int n,s,e,c;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>s>>e>>c;
a[s]=b[e]=c;
}
int cnt=0,tmp=0,i;
for(i=1;i<=1000;i++)
{
if(a[i]){
if(a[i]<=tmp)
tmp-=a[i];
else{
cnt+=(a[i]-tmp);
tmp=0;
}
}
if(b[i])
{
tmp+=b[i];
}
}
cout<<cnt<<endl;
return 0;
}
B. Teamwork(dp)
题意: 给定n只奶牛,每只奶牛有一个技能点,把1-n只奶牛连续分成多组,每组奶牛不超过k只,每只奶牛只能存在一组,且该组的奶牛技能点都会升高到与组里某只奶牛最高技能点一样,如何分配,求得n只奶牛总的技能点最大
思路: dp,dp[i]表示前i只奶牛总的最大技能点,而且第i只奶牛会会受到前面k只奶牛影响,复杂度O(n*k)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[10005],dp[10005];
int main()
{
int n,k;
ll sum=0;
cin>>n>>k;
for(int i=1;i<=n;i++)
cin>>a[i];
for(int i=1;i<=n;i++)
{
int maxx=-1;
for(int j=1;j<=min(i,k);j++)
{
maxx=max(maxx,a[i-j+1]);
dp[i]=max(dp[i],dp[i-j]+maxx*j);
}
}
cout<<dp[n]<<endl;
return 0;
}
C. Mooyo Mooyo(联通块dfs+简单模拟)
题意: 有点类似于消消乐,如果相邻同颜色的超过k块,就消去,消完后,若底下为空,由于重力会掉下去,问最后无法可消去后的方阵
思路: 先dfs一次求得各自相邻同颜色的方块数,若是满足>=k,则再dfs一次消去,接着模拟掉落过程,记住在地图mp[ ][ ]最底层为第n行,而不是第0行,模拟时不要写错,重复以上操作,直到符合条件结束循环
#include<bits/stdc++.h>
using namespace std;
char mp[105][15],vis[105][15];
int n,k,cnt;
int dis[4][2]=