8.28-407-模拟考
8.28-407-模拟考
T1 查找数
题意分析
给你一串数,让你求出这串数里面有没有指定的和。
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=305;
int n,a,b;
int c[N];
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>a>>b;
for(int i=1;i<=n;i++){
cin>>c[i];
}
for(int i=1;i<=n;i++){
if(c[i]==a+b){
cout<<i;
return 0;
}
}
return 0;
}
T2 数叉叉
题意分析
这一题其实跟上次的引爆炸弹差不多,都是递归搜索,每搜索到一个点,就向左上,右上,左下,右下去看,是不是井号即可。
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=105;
int n,m;
char c[N][N];
bool vis[N][N];
int s[N];
bool check(int x,int y){
return (x>=1&&x<=n&&y>=1&&y<=m&&vis[x][y]==0&&c[x][y]=='#');
}
void dfs(int x,int y){
vis[x][y]=1;
int sum=0;
for(int i=1;;i++){
// cout<<"check:"<<check(x-i,y-i)<<' '<<check(x-i,y+i)<<' '<<check(x+i,y-i)<<' '<<check(x+i,y+i)<<endl;
if(check(x-i,y-i)==1&&check(x-i,y+i)==1&&check(x+i,y-i)==1&&check(x+i,y+i)==1){
vis[x-i][y-i]=1;
vis[x-i][y+i]=1;
vis[x+i][y-i]=1;
vis[x+i][y+i]=1;
sum++;
}else{
break;
}
}
// cout<<"sum:"<<sum<<endl;
s[sum]++;
}
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>c[i][j];
}
}
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
if(c[i][j]=='#'){
memset(vis,0,sizeof(vis));
dfs(i,j);
}
}
}
// for(int i=1;i<=n;i++){
// for(int j=1;j<=m;j++){
// cout<<vis[i][j]<<' ';
// }
// cout<<endl;
// }
for(int i=1;i<=min(n,m);i++){
cout<<s[i]<<' ';
}
return 0;
}
T3 结算日
题意分析
我们先定义一个总钱数,正数表示没欠钱,负数表示欠钱了。在定义一个坐标,表示为上次欠钱的位置。
那么,如果欠了钱,什么时候去还钱呢?肯定是等有的钱比欠的钱多了,在一起去还钱,因为这样只要跑一次。
如果不欠钱,且之前欠了钱,那么就去还钱。如果这次欠了钱,就更新欠钱位置。
其实就是一个模拟加贪心。
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=1e5+5;
int n;
int a[N];
int m;
int ans;
int id;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
}
for(int i=1;i<=n;i++){
m+=a[i];
if(m>=0&&id!=0){
ans+=(i-id)*2;
id=0;
}
if(m<0&&id==0){
id=i;
}
}
cout<<ans+n;
return 0;
}
T4 落落的去的数学问题六
题意分析
我们先使用埃氏筛,选出所以的质数。然后三层循环枚举三个数,然后加上特判剪枝即可。
代码
#include<bits/stdc++.h>
#define int long long
#define endl '\n'
using namespace std;
const int N=4e5+5;
int n,o;
int ans;
bool a[N];
int p[N],cnt;
signed main(){
ios::sync_with_stdio(0);
cin.tie(0);
cout.tie(0);
cin>>n;
for(int i=2;i<=N;i++){
if(a[i]==0){
p[++cnt]=i;
// cout<<p[cnt]<<' ';
for(int j=i+i;j<=N;j+=i){
a[j]=1;
}
}
}
for(int i=1;;i++){
if(p[i]*p[i]*p[i]*p[i]*p[i]>n){
break;
}
for(int j=i+1;;j++){
if(p[i]*p[i]*p[j]*p[j]*p[j]>n){
break;
}
for(int k=j+1;;k++){
if(p[i]*p[i]*p[j]*p[k]*p[k]<=n){
ans++;
}else{
break;
}
}
}
}
cout<<ans;
return 0;
}