前言
这次比赛考的不错,第五名,180分。T1WA0,T2AC,T3WA0,T4WA80。
T1 生产武器
这道题是动态规划。设f[i]表示时间段(i~n)的最大空闲时间,k表示当前加工到第几个对付kid的零件。如果,则当前是空闲时间,则得到状态转移方程:f[i]=f[i+1]。否则,我们讨论所有
的k,求出f[i+t[k]]的最小值,则得到状态转移方程:f[i]=max{f[i]+t[k]}(
)。
比赛时没想到动态规划的方法,于是就用贪心骗了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
总结
这次比赛要改进的地方就是要加强读题能力,不能把题目理解错了。