a题
一个较为简单的模拟题,对其进行模拟
#include<bits/stdc++.h>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int m=a+b;
int x=1;
if(m>=10){
x=1;
}
else x=0;
if(x==0){
cout<<"Yes";
}
else{
cout<<"No";
}
}
b题
其实使用贪心的思想进行完成,而且要对其进行从小到大的排序
#include<bits/stdc++.h>
using namespace std;
using i64 = long long;
int main(){
i64 n, x;
cin >> n >> x;
vector<i64> a(n+1);
for(i64 i = 1; i <= n; i++) {
cin >> a[i];
}
sort(a.begin(), a.end());
i64 op = 0, f = 0;
for(i64 i = 1; i <= n; i++) {
if(a[i] <= x) {
f = f + 1;
op = a[i];
}
}
cout << f << " " << (x - op);
return 0;
}
c题
最开始是用转字符串to_string和stoi进行做的,然后漏掉了一些情况,这种要用dfs思想进行深搜进行判定
#include<bits/stdc++.h>
using namespace std;
using i64=long long;
string ans="100000000000000";
void dfs(i64 yu,string now){
if(yu==0){
if(now.length()<ans.length()){
ans=now;
}
return;
}
if(now.length()>ans.length())
return;
for(int i=0;i<9;i++){
dfs(((yu*10+i)%495),now+char('0'+i));
}
}
int main() {
i64 n;
cin>>n;
n%=495;
if(n==0){
cout<<-1;
return 0;
}
dfs(n,"");
cout<<ans;
return 0;
}
d题
怎么说呢,相当于就是才结论就是去首尾两端较大的字母,是属于博弈论里面的一种,最后一定会剩下一个字母,一个希望尽可能大,一个希望尽可能小,然后所以最后则是为了最优自己把删得只剩一位,看了下别人的答案,才理解的
#include<bits/stdc++.h>
using namespace std;
int main(){
int n;
string s;
cin>>n>>s;
cout<<max(s.front(),s.back());
return 0;
}
e题
这是个用bfs做的,感觉有点像最短路,但要记录是否访问,距离加上,以及在遇到蘑菇之后判定方向
#include<bits/stdc++.h>
using namespace std;
#define int long long
#define inf 0x3f3f3f3f
#define ll long long
#define pii pair<int, int>
#define db double
using namespace std;
const int maxn = 1e3 + 10;
const int mod = 998244353;
int vis[maxn][maxn][4];//是否访问
int dis[maxn][maxn][4];//储存最短距离数
char ch[maxn][maxn];//地图
struct Node {
int x, y, dir;
};
void solve() {
int n, m;
cin >> n >> m;
pii s, t;
for (int i = 1; i <= n; i++)
for (int j = 1; j <= m; j++) {
cin >> ch[i][j];
if (ch[i][j] == 'S')
s = pii(i, j);//起点
if (ch[i][j] == 'T')
t = pii(i, j);//终点
for (int k = 0; k < 4; k++)
vis[i][j][k] = 0, dis[i][j][k] = inf;
}
queue<Node> q;
for (int i = 0; i < 4; i++) {
auto [x, y] = s;
vis[x][y][i] = 1;
dis[x][y][i] = 0;
q.push(Node{x, y, i});
}
while (!q.empty()) {
auto [x, y, dir] = q.front();
q.pop();
if (pii(x, y) == t) {
continue;
}
int u, v;
if (dir == 0) {
u = 1;
v = 0;
} else if (dir == 1) {
u = 0;
v = 1;
} else if (dir == 2) {
u = -1;
v = 0;
} else {
u = 0;
v = -1;
}
int xx = x + u, yy = y + v;
if (xx < 1 || xx > n || yy < 1 || yy > m || vis[xx][yy][dir] ||
ch[xx][yy] == '#' || dis[xx][yy][dir] < dis[x][y][dir] + 1)
continue;
dis[xx][yy][dir] = dis[x][y][dir] + 1;
vis[xx][yy][dir] = 1;
q.push(Node{xx, yy, dir});
if (ch[xx][yy] == '*') {
int d1 = (dir - 1 + 4) % 4, d2 = (dir + 1) % 4;
if (vis[xx][yy][d1] == 0) {
vis[xx][yy][d1] = 1;
dis[xx][yy][d1] = dis[x][y][dir] + 1;
q.push(Node{xx, yy, d1});
}
if (vis[xx][yy][d2] == 0) {
vis[xx][yy][d2] = 1;
dis[xx][yy][d2] = dis[x][y][dir] + 1;
q.push(Node{xx, yy, d2});
}
}
}
int ans = inf;
for (int i = 0; i < 4; i++)
ans = min(ans, dis[t.first][t.second][i]);
if (ans == inf)
ans = -1;
cout << ans << endl;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie(0);
cout.tie(0);
int t;
cin >> t;
while (t--)
solve();
// system("pause");
return 0;
}
f题还没学状态dp,后面来补