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;
}