- chenshixian 的博客
陈室先的总结8.11day5
- @ 2024-8-9 19:01:13
题目传送门
T1 发射站
思路
暴力枚举可行的矩阵,再求其中的最大值
代码
#include<bits/stdc++.h>
using namespace std;
long long d,n,a[1111][1111],x,y,z,ma=-10000,jj;
int main(){
freopen("fsz.in","r",stdin);
freopen("fsz.out","w",stdout);
cin>>d>>n;
for(int i=1;i<=n;i++){
cin>>x>>y>>z;
a[x+1][y+1]+=z;
}
for(long long i=1;i<=129;i++){
for(long long j=1;j<=129;j++){
long long x=max((1ll),i-d),y=max((1ll),j-d);
long long xx=min((129ll),i+d),yy=min((129ll),j+d);
int s=0;
for(int ii=x;ii<=xx;ii++){
for(int j=y;j<=yy;j++){
s+=a[ii][j];
}
}
if(s==ma)jj++;
if(s>ma)ma=s,jj=1;
}
}
cout<<jj<<' '<<ma;
return 0;
}
错误与感想
在比赛中,我用的是二维前缀和,但用的有误搜易只拿了70分
以后要看题面去分析,可以想简单点就行简单点,不要出现这样的丢分
注:此题为暴力
T2翻译鸡
思路
思路见 陈室先的总结7.19day11:小W的病毒歼灭战
代码也是!!
算了
讲一下吧
就一下
- 先输入,然后再逐个处理(记得建个桶)
- 每次输入单词
- 如果是字典中有的单词,跳过
- 没有的话判断
- 如果容量满了就出队,那个词也要从桶中去标记
- 然后入队,桶标记,计数变量+1
- 输出 注:此题为队列
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,st[1111],q[111111],h=0,t=-1,j=0,x;
int main(){
freopen("fyj.in","r",stdin);
freopen("fyj.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=m;i++){
cin>>x;
if(st[x]==0){
if(t-h+1==n){
st[q[h]]--;
h++;
}
j++;
q[++t]=x;
st[x]++;
}
}
cout<<j;
return 0;
}
T3字符串
思路
/*
是不是'-'
是{
左右都是数字{
是降序或等于 直接输出
差为1 跳过
都不是{
是星号 算数量输出
不是{
是正序 正序输出
不是 正序输出
}
}
}
左右都是字母{
是降序或等于 直接输出
差为1 跳过
都不是{
是星号 算数量输出
不是{
是正序 正序输出
不是 正序输出
}
}
}
都不是 直接输出
}
不是 直接输出
*/
注:此题为字符串处理
代码
#include<bits/stdc++.h>
using namespace std;
int p1,p2,p3;
char d='*';
string s;
int main(){
freopen("zfc.in","r",stdin);
freopen("zfc.out","w",stdout);
cin>>p1>>p2>>p3;
cin>>s;
if(p1==1)d='a';
if(p1==2)d='A';
for(int i=0;i<s.size();i++){
if(s[i]=='-'){
if(i==0||i+1==s.size())cout<<s[i];
else{
int x,y;
if(s[i-1]>='0'&&s[i-1]<='9'&&s[i+1]>='0'&&s[i+1]<='9'){
x=s[i-1]-'0',y=s[i+1]-'0';
if(x>=y)cout<<'-';
else if(y-x==1)continue;
else{
if(d=='*')for(int i=1;i<=(y-x-1)*p2;i++)cout<<'*';
else{
if(p3==2)for(int j=y-1;j>x;j--)for(int h=1;h<=p2;h++)cout<<j;
else for(int j=x+1;j<y;j++)for(int h=1;h<=p2;h++)cout<<j;
}
}
}
else if(s[i-1]>='a'&&s[i-1]<='z'&&s[i+1]>='a'&&s[i+1]<='z'){
x=s[i-1]-'a',y=s[i+1]-'a';
if(x>=y)cout<<'-';
else{
if(d=='*')for(int i=1;i<=(y-x-1)*p2;i++)cout<<'*';
else{
if(p3==2)for(int j=y-1;j>x;j--)for(int h=1;h<=p2;h++)cout<<char(d+j);
else for(int j=x+1;j<y;j++)for(int h=1;h<=p2;h++)cout<<char(d+j);
}
}
}
else{
cout<<'-';
continue;
}
}
}
else cout<<s[i];
}
}
T4机器
思路
思路很简单,就是找坑补坑
- 我们扫描所有操作
- 求出编号,第几步,那个机器,多少时间
- 从上一次加工时间+1开始,找到加工时间足够的空就填上去,更新
代码
#include<bits/stdc++.h>
using namespace std;
int n,m,sx[444],jq[25][25],sj[25][25],st[25][7777],ss=0;
struct P{
int id=0,ww=0;
}la[444];
int main(){
freopen("jq.in","r",stdin);
freopen("jq.out","w",stdout);
cin>>m>>n;
for(int i=1;i<=n*m;i++)cin>>sx[i];
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>jq[i][j];
for(int i=1;i<=n;i++)for(int j=1;j<=m;j++)cin>>sj[i][j];
for(int i=1;i<=n*m;i++){
int no=sx[i];
int h=++la[no].id;
int j=jq[no][h];
int s=sj[no][h];
int k=0;
for(int r=la[no].ww+1;;r++){
if(st[j][r]==0)k++;
else k=0;
if(k>=s){
for(int b=r-k+1;b<=r;b++){
la[no].ww=r;
st[j][b]=1;
ss=max(ss,r);
}
break;
}
}
}
cout<<ss;
return 0;
}
错误与感想
这道题在比赛中没写,结果补题时自己写的代码特长,还##wa了,按老师思路写结果数据范围开小了,好不容易调好,发现交了几次24次!!!!!
以后要注意数据范围,不能再犯这样的低级错误,也不能再调这么久!!!
注:此题为模拟