2021.08.09【普及组】模拟赛C组 赛后总结

前言

        这次比赛考的不错,第五名,180分。T1WA0,T2AC,T3WA0,T4WA80。


T1 生产武器

        这道题是动态规划。设f[i]表示时间段(i~n)的最大空闲时间,k表示当前加工到第几个对付kid的零件。如果i\neq p_{k},则当前是空闲时间,则得到状态转移方程:f[i]=f[i+1]。否则,我们讨论所有p_{k}=i的k,求出f[i+t[k]]的最小值,则得到状态转移方程:f[i]=max{f[i]+t[k]}(p_{k}=i)。

        比赛时没想到动态规划的方法,于是就用贪心骗了0分。

#include <cstdio>
using namespace std;
int max(int a,int b);

const int INF=0x7fffffff/3;
const int N=100005,M=10000005;
int a[N],b[N],f[M];

int main()
{
	int m,n;
	freopen("produce.in","r",stdin);
	freopen("produce.out","w",stdout);
	scanf("%d %d",&m,&n);
	for (int i=1; i<=n; i++) scanf("%d %d",&a[i],&b[i]);
	int k=n;
	for (int i=m; i>=1; i--)
	{
		if (i==a[k])
			while (i==a[k])
			{
				f[i]=max(f[i],f[i+b[k]]);
				k--;
			}
		else f[i]=f[i+1]+1;
	}
	printf("%d",m-f[1]);
	return 0;
}

int max(int a,int b)
{
	if (a>b) return a;
	else return b;
}

T2 城市连接

        最短路径裸题。

#include <cstdio>
using namespace std;

const int INF=0x7fffffff/3;
const int N=1005;
int g[N][N],dis[N],q[4*N],bef[N],ans[N];
bool vis[N];

int main()
{
	int n;
	freopen("city.in","r",stdin);
	freopen("city.out","w",stdout);
	scanf("%d",&n);
	for (int i=1; i<=n; i++)
		for (int j=1; j<=n; j++)
		{
			scanf("%d",&g[i][j]);
			if (g[i][j]==0) g[i][j]=INF;
		}
	for (int i=1; i<=n; i++) dis[i]=INF;
	int head=1,tail=1;
	dis[1]=0;
	q[tail]=1;
	vis[1]=true;
	while (head<=tail)
	{
		int now=q[head];
		for (int i=1; i<=n; i++)
		{
			if (dis[now]+g[now][i]<dis[i])
			{
				dis[i]=dis[now]+g[now][i];
				bef[i]=now;
				if (!vis[i])
				{
					tail++;
					q[tail]=i;
					vis[i]=true;
				}
			}
		}
		head++;
		vis[now]=false;
	}
	int p=n;
	while (p)
	{
		ans[0]++;
		ans[ans[0]]=p;
		p=bef[p];
	}
	for (int i=ans[0]; i>=1; i--) printf("%d ",ans[i]);
	printf("\n%d",dis[n]);
	return 0;
}

T3 抢救文件

        就是友好城市,即最长不下降子序列。

        比赛时没读懂题目,被没用的x和y迷惑了。

#include <cstdio>
#define ll long long
using namespace std;
int max(ll a,ll b);
void swap(ll &a,ll &b);

const int N=500005;
ll a[N],b[N],f[N];

void qsort(int l,int r)
{
	int i=l,j=r;
	ll key=a[l];
	while (i<=j)
	{
		while (a[i]<key) i++;
		while (a[j]>key) j--;
		if (i<=j)
		{
			swap(a[i],a[j]);
			swap(b[i],b[j]);
			i++,j--;
		}
	}
	if (l<j) qsort(l,j);
	if (i<r) qsort(i,r);
}

int main()
{
	int n;
	ll _,__;
	ll ans=0;
	freopen("save.in","r",stdin);
	freopen("save.out","w",stdout);
	scanf("%lld %lld",&_,&__);
	scanf("%d",&n);
	for (int i=1; i<=n; i++) scanf("%d %d",&a[i],&b[i]);
	qsort(1,n);
	for (int i=2; i<=n; i++)
		for (int j=1; j<i; j++) 
			if (b[j]<b[i]) 
				f[i]=max(f[i],f[j]+1);
	for (int i=1; i<=n; i++) ans=max(ans,f[i]);
	printf("%d",ans+1);
	return 0;
} 

int max(ll a,ll b)
{
	if (a>b) return a;
	else return b;
}

void swap(ll &a,ll &b)
{
	ll t;
	t=a,a=b,b=t;
}

T4 机密文件

        二分答案+贪心算法。

        比赛时想到了正解,但没想到这数据竟然要求每个人都要分,因此WA80。

        详见https://blog.csdn.net/jz_2021_fengyue/article/details/119544613


总结

        这次比赛要改进的地方就是要加强读题能力,不能把题目理解错了。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值