- 阳子墨 的博客
8月集训 DAY9
- @ 2024-8-9 18:25:01
8月集训 DAY9
发射站
错误原因
(*  ̄︿ ̄)数组越界了!!!
思路
用二维前缀和,枚举每一个点,找到最大值 在枚举每一个点 找有多少个和最大值一样的点.
代码
#include<bits/stdc++.h>
using namespace std;
long long a[180][180],f[180][180];
int main()
{
freopen("fsz.in","r",stdin);
freopen("fsz.out","w",stdout);
long long d,n,x,y,k,ans=0,cnt=0;
cin>>d;
cin>>n;
for(int i=1;i<=n;i++)
{
cin>>x>>y>>k;
a[x+20][y+20]=k;
}
for(int i=1;i<=179;i++)
{
for(int j=1;j<=179;j++)
{
f[i][j]=f[i-1][j]+f[i][j-1]-f[i-1][j-1]+a[i][j];
}
}
for(int i=20;i<=148;i++)
{
for(int j=20;j<=148;j++)
{
ans=max(ans,f[i+d][j+d]-f[i-d-1][j+d]-f[i+d][j-d-1]+f[i-d-1][j-d-1]);
}
}
for(int i=20;i<=148;i++)
{
for(int j=20;j<=148;j++)
{
if(ans==(f[i+d][j+d]-f[i-d-1][j+d]-f[i+d][j-d-1]+f[i-d-1][j-d-1])) cnt++;
}
}
cout<<cnt<<" "<<ans;
}
翻译鸡
错误原因
无
思路
用一个队列 每次遍历队列 如果找不到入队并且cnt++ 同时如果达到内存上限 队头出队
代码
#include<bits/stdc++.h>
using namespace std;
int b[1010],a[1010],tt=-1,hh=0;
int main()
{
freopen("fyj.in","r",stdin);
freopen("fyj.out","w",stdout);
int n,m,flag=0,cnt=0;
cin>>m>>n;
for(int i=1;i<=n;i++)
{
flag=0;
cin>>b[i];
for(int j=hh;j<=tt;j++) if(a[j]==b[i]) flag=1;
if(!flag)
{
if(tt-hh+1>=m) hh++;
a[++tt]=b[i];
cnt++;
}
}
cout<<cnt;
}
字符串
错误原因
无
思路
按题意模拟即可
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
freopen("zfc.in","r",stdin);
freopen("zfc.out","w",stdout);
string s,s2;
int p1,p2,p3;
cin>>p1>>p2>>p3;
cin>>s;
for(int i=0;i<s.size();i++)
{
if(s[i]=='-'&&(s[i-1]>=97&&s[i+1]>=97||s[i-1]>=48&&s[i-1]<=57&&s[i+1]>=48&&s[i+1]<=57)&&s[i-1]<s[i+1])
{
if(s[i-1]+1==s[i+1]) continue;
if(p1==1)
{
if(p3==1) for(int j=int(s[i-1]+1);j<int(s[i+1]);j++) for(int k=1;k<=p2;k++) s2+=char(j);
else for(int j=int(s[i+1]-1);j>=int(s[i-1]+1);j--) for(int k=1;k<=p2;k++) s2+=char(j);
}
else if(p1==2)
{
if(p3==1)
{
if(s[i-1]>=97) for(int j=int(s[i-1]+1-32);j<int(s[i+1]-32);j++) for(int k=1;k<=p2;k++) s2+=char(j);
else for(int j=int(s[i-1]+1);j<int(s[i+1]);j++) for(int k=1;k<=p2;k++) s2+=char(j);
}
else
{
if(s[i-1]>=97) for(int j=int(s[i+1]-1-32);j>=int(s[i-1]+1-32);j--) for(int k=1;k<=p2;k++) s2+=char(j);
else for(int j=int(s[i+1]-1);j>=int(s[i-1]+1);j--) for(int k=1;k<=p2;k++) s2+=char(j);
}
}
else for(int j=int(s[i+1]-1);j>=int(s[i-1]+1);j--) for(int k=1;k<=p2;k++) s2+='*';
}
else s2+=s[i];
}
cout<<s2;
}
机器
思路没想到的原因
样例都没看懂
思路
遍历每个工序, 用step[i]来代表工件i现在的工序,now将这个工件备份 ll来代表这个工件的这个工序所用的时间 zz来代表来代表这个工件的这个工序的加工的机器数 last[i]来代表工件i上一个工序的完成时间 t[i][j]来表示第i个工件的第j单位时间
从last[now]+1开始直到空余的时间能大于ll 就把这一段时间标记为不空余的时间 ans=max(ans,现在的时间) 输出ans
代码
#include<bits/stdc++.h>
using namespace std;
int ans=0,t[30][7000],step[30],last[30],ori[410];
struct node
{
int tm;
int jiqi;
};
node a[410][410];
int main()
{
freopen("jq.in","r",stdin);
freopen("jq.out","w",stdout);
int m,n;
cin>>m>>n;
for(int i=1;i<=m*n;i++) cin>>ori[i];
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j].jiqi;
}
}
for(int i=1;i<=n;i++)
{
for(int j=1;j<=m;j++)
{
cin>>a[i][j].tm;
}
}
for(int i=1;i<=n*m;i++)
{
int now=ori[i];
int k=++step[now];
int ll=a[now][k].tm;
int zz=a[now][k].jiqi;
int s=0;
for(int q=last[now]+1;;q++)
{
if(t[zz][q]==0) s++;
else s=0;
if(s>=ll)
{
for(int h=q-s+1;h<=q;h++)
{
t[zz][h]=1;
last[now]=h;
ans=max(ans,h);
}
break;
}
}
}
cout<<ans;
}