纪中2020.2.25普及C组模拟赛总结

这次考得不好

T1

比赛的时候就想到了一个简单的暴力方法,
后来发现有点小瑕疵,
硬着头皮打了下去,
样例虽然过了但 0 p t s 0pts 0pts !

其实正解也是暴力,只是我的脑子没转过弯来。

A C   C o d e AC~Code AC Code

#include
#include
#include
using namespace std;
int n,m,x,y,j=10000,maxx,js;
int a[1000010][3],b[10010],c[10010];
int main()
{
	freopen("friend.in","r",stdin);
	freopen("friend.out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1; i<=m; i++)
	 {
		scanf("%d%d",&x,&y);
		a[i][1]=x;
		a[i][2]=y;
		b[x]++;
		b[y]++;
		if(b[x]>maxx||b[x]==maxx&&j>x)
		 {
			maxx=b[x];
			j=x;
		 }		
		if(b[y]>maxx||b[y]==maxx&&j>y)
		 {
			maxx=b[y];
			j=y;
		 }
	 }
	for(int i=1; i<=m; i++)
	 {
		if(a[i][1]==j)
		  c[++js]=a[i][2]; 
		if(a[i][2]==j)
		  c[++js]=a[i][1];
	 }
	sort(c,c+js+1);
	for(int i=1; i<=js; i++)
	   printf("%d ",c[i]);
	return 0;
}

T2

想着用图论拿取80%得分数
结果——
我最短路炸了。。。

正解:并查集+高精度

A C   C o d e AC~Code AC Code

T3

瞎搞了一个DP,样例都没过,胡乱交了上去。。。
百分之百 0 p t s 0pts 0pts

正解:DP+单调队列优化
终于入门啦!


讲解本题的单调队列优化

这里的队列并不是直接取伤害的值,而是存着地址
我们可以通过 q q q(队列)中的元素来找到dp中的元素
那么我们认为 q [ h ] q[h] q[h]存着最低伤害的方案

为了保证 f [ i ] f[i] f[i] q q q中元素是合法的,也就是说, q q q中的元素必须在 i − R − 1 i-R-1 iR1以内,不然跳不到 i i i上面。

所以要加上这一句:
while(h<=t&&q[h]

A C   C o d e AC~Code AC Code

#include
#include
#include
#include
using namespace std;
int n,l,r,f[1000010],a[1000010];
int h,t,q[1000010];
int main()
{
    freopen("jump.in","r",stdin);
    freopen("jump.out","w",stdout);
    cin>>n>>l>>r;
    for(int i=1; i<=n; i++)
     {
     	cin>>a[i];
     	f[i]=16843009;
     }
    h=1;
    for(int i=1; i<=n; i++)
     {
     	if(i-l-1>=0)
     	 {
     	 	while(h<=t&&f[q[t]]>=f[i-l-1]) //为了把新加入队列的元素放到适合它的位置。
     	 	 t--;
     	 	t++;
     	 	q[t]=i-l-1;
     	 }
     	while(h<=t&&q[h]<i-r-1)
     	  h++;
     	if(h<=t)
     	  f[i]=a[i]+f[q[h]];
     }
   if(f[n]<16843009)
     cout<<f[n];
   else
     cout<<-1;
   return 0;
}

T4

我的贪心打错了一个变量,一个变量!
这让我丢失了 76.5 p t s 76.5pts 76.5pts (心痛)。

A C   C o d e AC~Code AC Code

#include
#include
#include
using namespace std;
int n,a,b,z,ans,zx,zd,zx1,zd1;
int c[500010];
int main()
{
    freopen("door.in","r",stdin);
    freopen("door.out","w",stdout);
    cin>>n;
    for(int i=1; i<=n; i++)
     {
     	cin>>a>>b;
     	c[i]=a+b;
     }
    zx=0,zd=c[1];
    for(int i=2; i<=n; i++)
     {
     	if(c[i]<zx)
     	 {
     	 	zx=0;
     	 	zd=c[i];
     	 }
     	else
     	 {
     	 	ans++;
     	 	zx1=c[i]-min(c[i],zd);
            zd1=c[i]-zx;
            zx=zx1;
            zd=zd1;
     	 }
     }
    cout<<ans;
    return 0;
}

总分:

0 + 0 + 0 + 23.5 = 23.5 p t s 0+0+0+23.5=23.5pts 0+0+0+23.5=23.5pts

总结:

天 才 出 于 勤 奋 — — 高 尔 基 天才出于勤奋——高尔基

你可能感兴趣的:(计划and比赛,并查集,单调队列优化)