Hallo,大家好!不知不觉就过了11天了,让我们共同努力吧!
目录
A 天干地支
解析:
这是一道模拟题,我们已知2020年输出是“gengzi”,而2020%10==0,geng的位置需要在此加6再去取余,所以输出要(n+6)%10,同理地支也是如此。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string a[]= {"jia","yi","bing","ding","wu","ji","geng","xin","ren","gui"};
string b[]= {"zi","chou","yin","mao","chen","si","wu","wei","shen","you","xu","hai"};
int main() {
int n;
cin>>n;
cout<<a[(n+6)%10]<<b[(n+8)%12];
return 0;
}
B 包子凑数
解析:
一道完全背包问题,具体解析放到代码了。这个代码很奇怪,试了2k组数据都是对的,而在我的评测机下只能拿87.5,但是在Pluto的评测机是正确的,我不能理解,我非常不能理解!
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
//100*100是10000,所以开到10000就够了,下面判定也是
int a[105],b[10005];//a存数,b标记
int main() {
int n;
bool flag=false;//用于标记是否会输出INF
cin>>n;
for(int i=0; i<n; i++) {
cin>>a[i];
b[a[i]]=1; //标记该数可以表示
}
//类似完全背包(从小到大枚举)
for(int i=0; i<n; i++)
for(int j=1; j<=10000; j++)
if(b[j]) b[j+a[i]]=1; //DP,如果该数能表示,那么往后加已有的包子数目依旧能表示
int cnt=0;//计算能 连续 表示多少个
for(int i=1; i<=10000; i++) {
if(b[i]) cnt++;
else cnt=0;//断开要重置
if(cnt==a[0]) flag=true;//有限个不能表示
}
int sum=0;//计算有几个不能被表示的包子数目
if(!flag) cout<<"INF"; //无限个不能表示
else {
for(int i=1; i<=10000; i++)
if(!b[i]) sum++;
cout<<sum;
}
return 0;
}
C 求值
解析:
简单模拟题,直接暴搜,从1开始也行,只是会T,不过是填空题,答案对了就行。由于答案是45360,所以我直接从45350开始了,嘻嘻嘻!
代码:
#include <iostream>
#include <cstring>
#include <algorithm>
using namespace std;
typedef long long LL;
int main() {
for(int i=45350; ; i++) {
int s=0;
for(int j=1; j<=i; j++)
if(i%j==0) s++;
if(s==100) {
cout<<i;
return 0;
}
}
return 0;
}
D 青蛙跳杯子
解析:
这是一道简单的BFS题(队列),题目的意思是这个*可以往前走1、2、3步或往后走1、2、3步,还有这个题目的W和B没什么用,混淆视听吧。然后走到的位置和当前的青蛙换位,也就是swap。输入是两个字符串,初始和目标,我们用两个string存储。题目问的是至少,我们可以理解为最少要几步到目标状态(说个题外话,迷宫里是非空队列出队头元素,用for遍历四个方向,然后检测周围是否符合题意,如符合标记该点并用新变量或者交换元素入队,随后继续重复操作),而这个题不是遍历4个方向(1维),而是遍历6种情况,我们也可以像上面那样进行入队,不过我们要标记当前状态,可是这次不能标记点,而是标记整个字符串,所以我们可以用哈希、map、set等方法来标记,也可以在结构体中定义一个判断变量来实现。
代码:
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
string st,s;
const int dr[6]= {-3,-2,-1,1,2,3};//6种情况
int n;
map<string, int> mapp;//map中string映射到int,标记并存储步数
queue<string> q;
//bfs模板
int bfs() {
q.push(st);
mapp[st]=0;//起点
while(!q.empty()) {
int x;
string ss=q.front();
q.pop();
int d=mapp[ss];//存储用的步数
//找到空杯子的位置,也可以用x=ss.find('*')
for(int i=0; i<n; i++)
if(ss[i]=='*') {
x=i;
break;
}
for(int i=0; i<6; i++) {
int z=x+dr[i];
if(z<0 || z>=n) continue;//边界
string aa;
aa=ss;
aa[x]=ss[z];
aa[z]=ss[x];//交换,也可以直接用swap
//swap(ss[x],ss[z]);
//未标记过
if(!mapp.count(aa)) {
mapp[aa]=d+1;//步数+1
if(aa==s) return mapp[aa];
q.push(aa);
}
//swap(ss[x],ss[z]);
}
}
}
int main() {
cin>>st>>s;
n=st.size();
cout<<bfs();
return 0;
}