- 赵一静 的博客
八月暑期集训8月9日DAY5题解
- @ 2024-8-9 18:07:24
发射站(模拟)
思路没想到的原因
思路方向没有对,本来想直接模拟的,结果没对。
思路
因为题目的数据范围很小,所以可以循环遍历正方形的中心坐标,求出能覆盖的点的总和。
还需注意越界问题。(别问我怎么知道的)
代码
#include <bits/stdc++.h>
using namespace std;
const int tt=1010;
int a[tt][tt];
map<int,int> mp;
int main(){
freopen("fsz.in","r",stdin);
freopen("fsz.out","w",stdout);
int d;
int n;
int max_n=0;
int cnt=0;
int ans=0;
cin >>d>>n;
for(int i=1;i<=n;i++){
int x,y,k;
cin >>x>>y>>k;
a[x][y]=k;
}
ans=0;
for(int i=0;i<=128;i++){
for(int j=0;j<=128;j++){
ans=0;
for(int k=max(i-d,0);k<=min(i+d,128);k++){
for(int t=max(j-d,0);t<=min(j+d,128);t++){
ans+=a[k][t];
}
}
max_n=max(max_n,ans);
mp[ans]++;
}
}
cout <<mp[max_n]<<" "<<max_n;
return 0;
}
翻译鸡(模拟)
思路
其实是小W的病毒歼灭战原题。 用一个队列来统计,遇到没有的入队,全满了就让第一个出队,并。
代码
#include <bits/stdc++.h>
using namespace std;
const int N=1010;
int a[N],f[N];
queue<int> q;
int hh=0,tt=-1;
int main(){
freopen("fyj.in","r",stdin);
freopen("fyj.out","w",stdout);
int m,n;
cin >>m>>n;
for(int i=0;i<n;i++){
cin >>a[i];
q.push(a[i]);
}
int cnt=0;
for(int i=0;i<n;i++){
int w=q.front();
q.pop();
bool flag=1;
for(int j=hh;j<=tt;j++){
if(f[j]==w) flag=0;
}
if(flag!=0){
cnt++;
if(tt-hh+1==m) hh++;
f[++tt]=w;
}
}
cout <<cnt;
return 0;
}
字符串(模拟)
思路没想到的原因
没有判断一种情况,且思路和代码很乱。以后要打草稿,把代码的可读性增强。
思路
判断是否是,如果是,就判断上一个字符与下一个字符是否都是字母或都是数字,且上一个字符是否小于下一个字符。
如果条件都满足,那么我们就根据 的条件来输出。
如果条件不满足,输出。
当前字符若不是,直接输出当前字符。
代码
#include <bits/stdc++.h>
using namespace std;
bool f(char z){
return z>='a'&&z<='z';
}
char p(char z){
if(z>='a'&&z<='z') return z-32;
else return z;
}
int main(){
freopen("zfc.in","r",stdin);
freopen("zfc.out","w",stdout);
int p1,p2,p3;
bool flag=1;
cin >>p1>>p2>>p3;
string s;
int cnt=0;
cin >>s;
for(int i=0;i<s.size();i++){
if(s[i]!='-') cout <<s[i];
else if(s[i]=='-'){
if((isdigit(s[i-1])&&isdigit(s[i+1])&&s[i+1]>s[i-1])||(f(s[i-1])&&f(s[i+1])&&s[i+1]>s[i-1])){
if(p3==1){
for(char j=s[i-1]+1;j<=s[i+1]-1;j++){
cnt=0;
while(cnt!=p2){
if(p1==1){
cout <<char(j);
cnt++;
}else if(p1==2){
cout <<char(p(j));
cnt++;
}else{
cout <<"*";
cnt++;
}
}
}
}else{
for(char j=s[i+1]-1;j>=s[i-1]+1;j--){
cnt=0;
while(cnt!=p2){
if(p1==1){
cout <<char(j);
cnt++;
}else if(p1==2){
cout <<char(p(j));
cnt++;
}else{
cout <<"*";
cnt++;
}
}
}
}
}else{
cout <<"-";
}
}
}
return 0;
}
机器(模拟)
思路没想到的原因
样例都没有看懂,以后注意时间的规划。
思路
直接模拟。把输入的存好,按照流水线来,创造两个时间轴,一个一个存入空白的地方。存完之后,标记,以防后面又遍历一次。
我们用来代表工件现在的工序,用来将这个工件备份,用来代表这个工件的这个工序所用的时间。
代码
#include <bits/stdc++.h>
#define id first
#define tm second
using namespace std;
const int tt=510;
int a[tt][7000],ord[tt],step[tt],last[tt];
pair<int,int> tim[tt][tt];
int main(){
freopen("jq.in","r",stdin);
freopen("jq.out","w",stdout);
int m,n;
cin >>m>>n;
for(int i=1;i<=n*m;i++){
cin >>ord[i];
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin >>tim[i][j].id;
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin >>tim[i][j].tm;
}
}
int ans=0;
for(int i=1;i<=n*m;i++){
int now=ord[i];
int k=++step[now];
int x=tim[now][k].id;
int t=tim[now][k].tm;
int s=0;
for(int j=last[now]+1;;j++){
if(a[x][j]==0) s++;
else s=0;
if(s>=t){
for(int q=j-s+1;q<=j;q++){
ans=max(ans,j);
last[now]=j;
a[x][q]=1;
}
break;
}
}
}
cout <<ans;
return 0;
}