- 张家宁 的博客
八月DAY5
- @ 2024-8-9 18:08:29
1.发射站
思路
暴力枚举!!
代码
#include<bits/stdc++.h>
using namespace std;
struct P{
int x,y,t;
};
P a[30];
int main(){
freopen("fsz.in","r",stdin);
freopen("fsz.out","w",stdout);
int d,n;
int ans=0;
cin>>d>>n;
for(int i=1;i<=n;i++){
cin>>a[i].x>>a[i].y>>a[i].t;
}
int op=0;
for(int x=0;x<=128;x++){
for(int y=0;y<=128;y++){
int cnt=0;
for(int i=1;i<=n;i++){
if(abs(x-a[i].x)<=d&&abs(y-a[i].y)<=d){
cnt+=a[i].t;
}
}
ans=max(ans,cnt);
}
}for(int x=0;x<=128;x++){
for(int y=0;y<=128;y++){
int cnt=0;
for(int i=1;i<=n;i++){
if(abs(x-a[i].x)<=d&&abs(y-a[i].y)<=d){
cnt+=a[i].t;
}
}
if(ans==cnt){
op++;
}
}
}
cout<<op<<" "<<ans;
return 0;
}
2.翻译坤
思路
暴力
代码
#include<bits/stdc++.h>
using namespace std;
queue<int> a;
unordered_map<int,bool> mp;
int main(){
freopen("fyj.in","r",stdin);
freopen("fyj.out","w",stdout);
int m,n;
cin>>m>>n;
long long ans=0;
for(int i=1;i<=n;i++){
int x;
cin>>x;
if(mp[x]==0){
if(a.size()==m){
mp[a.front()]=0;
a.pop();
a.push(x);
mp[x]=1;
}else{
a.push(x);
mp[x]=1;
}
ans++;
}
}
cout<<ans;
return 0;
}
3. 字符串
思路
大模拟!!
具体思路
-
我们先考虑普通情况,如果遇到“-”,那么就可以判断进行以下操作
- 从第一个字母的ASCLL码循环到第二个字母ASCLL码,将这一些字符存在一个
string中,这里我们命名为。 - 判断参数: 如果那么将其全改成小写。如果是,那么就只要将其全改成大写。如果是,只要循环一遍,将其全改成
* - 如果不是合法的,设为
-
- 从第一个字母的ASCLL码循环到第二个字母ASCLL码,将这一些字符存在一个
-
再判断特殊情况:
- 当
-连续重复出现时,直接跳过 - 当
-出现在开头或结尾时,不管他。 - 当
-的左边和右边的数不是一类的,(如左边是“1”,右边是“A”。或左右大小写不相同)直接跳过。
- 当
-
我们最好是最后输出,本次的示例代码是边加载边输出。
代码
#include<bits/stdc++.h>
using namespace std;
bool sud1(char a,char b,char c){
bool a1,b2;
if('A'<=a&&a<='Z'){
a1=1;
}
if('A'<=b&&b<='Z'){
b2=1;
}
if((a=='-'&&b=='-')||(c=='-'&&b=='-')||(c=='-'&&a=='-')){
return true;
}
if(isdigit(a)!=isdigit(b)){
return true;
}
if(a1!=b2){
return true;
}else{
return false;
}
}
int main(){
freopen("zfc.in","r",stdin);
freopen("zfc.out","w",stdout);
int p1,p2,p3;
cin>>p1>>p2>>p3;
string a;
cin>>a;
for(int i=0;i<a.size();i++){
string as;
if(a[i]=='-'&&i!=0&&i!=a.size()-1){
for(int p=a[i-1]+1;p<a[i+1];p++){
for(int j=1;j<=p2;j++){
as=as+(char)(p);
}
}
if(p1==1){
for(int p=0;p<as.size();p++){
if('A'<=as[p]&&as[p]<='Z'){
as[p]+=32;
}
}
}
if(p1==2){
for(int p=0;p<as.size();p++){
if('a'<=as[p]&&as[p]<='z'){
as[p]-=32;
}
}
}
if(p1==3){
for(int p=0;p<as.size();p++){
as[p]='*';
}
}
if(p3==2){
for(int p=0;p<as.size()/2;p++){
char u;
u=as[p];
as[p]=as[as.size()-1-p];
as[as.size()-1-p]=u;
}
}
if(a[i-1]>=a[i+1]||sud1(a[i-1],a[i+1],a[i])){
as="-";
}
cout<<as;
}else{
cout<<a[i];
}
}
return 0;
}
反思
没有将特殊情况列在纸上逐一排查,也没有打草稿。
还有,之后要将每一个部分用函数来“分装”不明显,不好滴BUG,将一些部分写函数中,如果有问题只检查那个函数就好了
4.机器
思路
按照上面约定,直接模拟。
具体思路
-
数组定义:
- 数组表示到制作第个零件了。
- 数组表示第个零件目前到第几道工序了。
- 表示第个零件的第个工序要用什么机子做。
- 表示第个零件的第个工序的时间。
- 表示第i个零件的上一次出现在哪。
- 表示第个零件的第个时刻,0表示还没用,1表示已经用了。
-
输入:
- 将顺序存在数组中。
- 将前行(详情见题目)存在中。
- 将其他的存在中。
-
模拟(做题核心)
-
命名:为了方便使用,简单易懂,我们将数组中的必要元素存到变量中:
- ,表示制作到的零件了
- 求当前制作到哪个工序了(由于数组初始值为0,所以用)
- ,表示要用哪个机子。
- ,表示加工这个零件的时间。
- ,表示这个零件上一道工序在哪个时间节点结束。因为必须做完上一道工序才可以做下一道。
- ,记录点前时间节点(用来判断这个位置是否可以存下)
-
下面正式开始解题
-
将时间枚举一遍,如果这个时间还没用过,那么,因为可以将这个存在这。如果不行的话因为前面的都不能存下来。
-
如果可以存下(满足条件),就将一路上的时间设为1
-
将那个时间节点和目前的取值,其中是结果
-
-
输出
代码
#include<bits/stdc++.h>
using namespace std;
struct P{
int id,tm;
};
int ord[410];
int steep[30];
int tim[30][7010];
int last[410];
P a[30][30];
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>>ord[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j].id;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>a[i][j].tm;
}
}
//开始模拟
int ans=0;
for(int i=1;i<=n*m;i++){
int now=ord[i];
int k=++steep[now];
int x=a[now][k].id;
int tm=a[now][k].tm;
int op=last[now];
int s=0;
for(int j=op+1;;j++){
if(tim[x][j]==0){
s++;
}else{
s=0;
}
if(s==tm){
for(int q=j-s+1;q<=j;q++){
tim[x][q]=1;
}
last[now]=j;
ans=max(ans,j);
break;
}
}
}
cout<<ans;
return 0;
}
反思
没有做题经验,明明有思路却做不出来。
我知道了如果做题错了还要检查=是否写成==