- 吴易繁 的博客
8(八)月(暑期)集训DAY05(模拟专题)
- @ 2024-8-9 18:40:35
A. 发射站
思路
对于这题我们可以循环遍历正方形的中心坐标,并循环求覆盖点的总和。 注意方案数量和越界问题,这是我们就会想了:这么写会不会超时呢?实际上是不会的,因为本题数据范围很小,所以不用二维前缀和来优化。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=2e2+10;
int a[N][N];
int main(){
freopen("fsz.in","r",stdin);
freopen("fsz.out","w",stdout);
int d,n;
cin>>d>>n;
for(int i=1;i<=n;i++){
int x,y,k;
cin>>x>>y>>k;
a[x][y]=k;
}
int ans=0,cnt=0;
for(int i=d;i<=128-d;i++)
for(int j=d;j<=128-d;j++){
int sum=0;
for(int k=i-d;k<=i+d;k++){
for(int t=j-d;t<=j+d;t++) sum+=a[k][t];
}
ans=max(ans,sum);
}
for(int i=0;i<=128;i++)
for(int j=0;j<=128;j++){
int sum=0;
for(int k=i-d;k<=i+d;k++){
for(int t=j-d;t<=j+d;t++) if(k>=0&&t>=0) sum+=a[k][t];
}
if(sum==ans) cnt++;
}
cout<<cnt<<" "<<ans;
return 0;
}
对于这道题目我在考试的时候想到了用二维前缀和来做,但是不知道怎么做,所以就放弃了,下一次一定不能轻易放弃,同时也要再巩固一下二维前缀和的实际应用。
B. 翻译鸡
思路
对于这道题目我们稍加观察即可发现,本题其实和七月暑期集训DAY11的小W的病毒歼灭战是一样的,所以按照小W的病毒歼灭战这题的思路来写即可。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e3+10,M=1e2+10;
int a[N],b[M];
int main(){
freopen("fyj.in","r",stdin);
freopen("fyj.out","w",stdout);
int m,n,ans=0,idx=1;
cin>>m>>n;
for(int i=1;i<=m;i++) b[i]=1010;
for(int i=1;i<=n;i++){
bool flag=0;
cin>>a[i];
for(int j=1;j<=m;j++){
if(a[i]==b[j]){
flag=1;
break;
}
}
if(!flag){
b[idx]=a[i];
idx++;
if(idx>m) idx=1;
ans++;
}
}
cout<<ans;
return 0;
}
本题已AC,下一次还需要继续努力。
C. 字符串
思路
对于这道题目我们分类讨论即可,分类如下:
- p1情况:
- 等于1,将字符串改为小写。
- 等于2,将字符串改为大写。
- 等于3,不论是字母子串还是数字字串,都用与要填充的字母个数相同的星号*来填充
- 然后遍历循环p2次,中间可能出现的情况如下:
- 如果减号右边的字符恰好是左边字符的后继,只删除中间的减号。
- 如果减号右边的字符按照ASCII码的顺序小于或等于左边字符,输出时,要保留中间的减号。
- 若同为数字或字母,连续输出。
- p3情况:
- 等于1, 表示维持原来顺序。
- 等于2,表示采用逆序输出,注意这时候仍然不包括减号两端的字符。
代码
#include<bits/stdc++.h>
using namespace std;
int main(){
freopen("zfc.in","r",stdin);
freopen("zfc.out","w",stdout);
int p1,p2,p3;
cin>>p1>>p2>>p3;
string s,s1,s2,s3;
cin>>s;
if(p1==1){
for(int i=0;i<s.size();i++){
if(s[i]>='A'&&s[i]<='Z') s3+=s[i]+32;
else s3+=s[i];
}
}
if(p1==2){
for(int i=0;i<s.size();i++){
if(s[i]>='a'&&s[i]<='z') s3+=s[i]-32;
else s3+=s[i];
}
}
if(p1==3){
for(int i=0;i<s.size();i++) s3+=s[i];
for(int i=0;i<s.size();i++){
if(s[i]=='-'&&i!=0&&i+1!=s.size()){
if(s[i-1]+1==s[i+1]) continue;
else if(s[i+1]<=s[i-1]) s1+='-',s2+='-';
else if((s[i+1]>='0'&&s[i+1]<='9'&&s[i-1]>='0'&&s[i+1]<='9')||
(s[i+1]>='a'&&s[i+1]<='z'&&s[i-1]>='a'&&s[i+1]<='z')||
(s[i+1]>='A'&&s[i+1]<='Z'&&s[i-1]>='A'&&s[i+1]<='Z')){
for(char j=s3[i-1];j<s3[i+1];j++){
int p4=p2;
while(p4--&&j!=s3[i-1]) s1+='*',s2+='*';
}
}
else s1+='-',s2+='-';
}
else s1+=s[i],s2+=s[i];
}
}
if(p1!=3){
for(int i=0;i<s.size();i++){
if(s[i]=='-'&&i!=0&&i+1!=s.size()){
if(s[i-1]+1==s[i+1]) continue;
else if(s[i+1]<=s[i-1]) s1+='-',s2+='-';
else if(s[i+1]>='0'&&s[i+1]<='9'&&s[i-1]>='0'&&s[i+1]<='9'||
s[i+1]>='a'&&s[i+1]<='z'&&s[i-1]>='a'&&s[i+1]<='z'||
s[i+1]>='A'&&s[i+1]<='Z'&&s[i-1]>='A'&&s[i+1]<='Z'){
for(char j=s3[i-1];j<s3[i+1];j++){
int p4=p2;
while(p4--&&j!=s3[i-1]) s1+=j;
}
for(char j=s3[i+1]-1;j>s3[i-1];j--){
int p4=p2;
while(p4--&&j!=s3[i+1]) s2+=j;
}
}
else s1+='-',s2+='-';
}
else s1+=s[i],s2+=s[i];
}
}
if(p3==1) cout<<s1;
if(p3==2) cout<<s2;
return 0;
}
在考试的时候我们的代码之所以得了40分,是因为代码出现了2个BUG:
- p1=3,没将s3存进去。
- 没考虑不同为数字或字母的问题。
D. 机器
思路
由于一道工序有多种数据,而我们又无法改变加工顺序,因此只能用多个数组分别记录在什么时间,在哪个机器,是什么零件。 但是还有一个问题,那就是我们无法知道现在是第几个工序,因此需要用一个桶记录每个零件的加工次数。 因为必须先进行前面的工序在进行后面的工序,所以还需要一个数组来记录第i个零件上一次在什么时候加工。 再用一个数组记录加工情况,每次从上一次加工结束处遍历这个数组,直到找到一个长度大于这道工序所需时间,那就将其从这个长度开始,到工序所需时间结束标为已加工,并记录下加工结束时间, 同时更新时间的最大值,最后输出即可。
代码
#include<bits/stdc++.h>
using namespace std;
int a[30][30],t[30][30],st[410],c[30],last[30],mk[30][8010],mx=0;
void fd(int x,int y){
int idx=a[x][y],ti=t[x][y],len=0;
for(int i=last[x]+1;;i++){
if(mk[idx][i]==0) len++;
else len=0;
if(len==ti){
for(int j=i-len+1;j<=i;j++) mk[idx][j]=x;
last[x]=i;
mx=max(mx,i);
return ;
}
}
}
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>>st[i];
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>a[i][j];
for(int i=1;i<=n;i++) for(int j=1;j<=m;j++) cin>>t[i][j];
for(int i=1;i<=m*n;i++){
c[st[i]]++;
fd(st[i],c[st[i]]);
}
cout<<mx;
return 0;
}
没有时间了,所以没做这题,下次要提高做题速度。