寒假4

A

#include<bits/stdc++.h>
using namespace std;
int main(){
    int a,b,k;
    cin>>a>>b>>k;
    if(a>=b*k)cout<<"good\n";
    else cout<<"bad\n";
}

B

先看不能操作的时候就是 1 ,ai石子变为1需要ai-1,求和为总消耗w=sum(ai)-n

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n;
    cin>>n;
    int a[n];
    int sum=0;
    for(int i=0;i<n;i++)
    {
        cin>>a[i];
        sum+=a[i];
    }
    if((sum+n)%2==0)cout<<"sweet\n";
    else cout<<"gui\n";
    return 0;
}

C

看数据范围 直接模拟

(最开始写的时候没注意 从前往后交换了,后面wa了才看到要把最后放到前面)

#include <bits/stdc++.h>
using namespace std;

int main() {
    int n,m,x,y;
    cin>>n>>m>>x>>y;
    vector<string> g(n);
    for(int i=0;i<n;i++)cin>>g[i];
    int p,q;
    cin>>p>>q;
    pair<int,int>pr[q];
    for(int i=0;i<q;i++)cin>>pr[i].first>>pr[i].second;
    while(p--)
    {
        for(int i=0;i<q;i++)
        {
            int op=pr[i].first,z=pr[i].second-1;
            if(op==1)
            {
                for(int j=m-1;j>=1;j--)swap(g[z][j],g[z][j-1]);
            }
            else
            {
                for(int j=n-1;j>=1;j--)swap(g[j][z],g[j-1][z]);
            }
            //for(string s:g)cout<<s<<endl;
        }
    }
    cout<<g[x-1][y-1]<<endl;
    return 0;
}

D

难绷 思维没到

其实和b类似,您只需要看操作后是怎样的,这里操作后数组的和不会变,就可以抽象为将sum(ai)分割,找sum因子就行,sum>=i*n我没直接写for里,先存set然后筛也能过

题目好名字()

#include "bits/stdc++.h"
#define int long long
using namespace std;

signed main() {
    int n;
    cin >> n;

    int sum = 0;
    for (int i = 0; i < n; i++) {
        int x;
        cin >> x;
        sum += x;
    }

    int cnt = 0;
    for (int i = 1; sum / i >= n; i++) {
        if (sum % i == 0) {
            cnt++;
        }
    }

    if(n!=1)cout << cnt << endl;
    else cout << 1 << endl;
    
}

E

题目好懂

前缀和维护一下

考虑贪心,map记录前缀和%后的余数

用两个指针指向前面和后面的位置查看 if : (sum[i]-sum[p])%k0||mp[sum[i]%k]1代表可以分割下去

然后指针继续往后跑就行

#include <bits/stdc++.h>
#define int long long
using namespace std;

signed main() {
    int n,k;
    cin>>n>>k;
    int a[n+1];
    int pre[n+1];
    pre[0]=0;
    for(int i=1;i<=n;i++){
        cin>>a[i];
        //a[i]=a[i]%k;
        pre[i]=pre[i-1]+a[i];
    }
    int j=0,cnt=0;
    map<int,int>mp;
    for(int i=1;i<=n;i++){
        if((pre[i]-pre[j])%k==0||mp[pre[i]%k]==1){
            cnt++;
            j=i;
            mp.clear();
        }else{
            mp[pre[i]%k]=1;
        }
    }
    cout<<cnt<<endl;
}

G

前缀和预处理一下,然后遍历找*找到一个就一直找一个方向的就行了,我把代码hang出来了已经神志有点不清了,因为我要补下一场的了........

#include<bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
    int n,m;
    cin>>n>>m;
    vector<vector<int>> a(n+2,vector<int>(m+2,0)),pre(a);
    for(int i=1;i<=n;++i) {
        string s;
        cin>>s;
        for(int j=1;j<=m;++j) {
            if(s[j-1]=='.') {
                a[i][j]=0;
            } else {
                a[i][j]=1;
            }
            pre[i][j]=pre[i][j-1]+a[i][j];
        }
    }
    int cnt=0;
    for(int i=1;i<=n;++i) {
        for(int j=1;j<=m;++j) {
            if(a[i][j]==0) {
                continue;
            }
            int lx=i,ly=j,rx=i,ry=j;
            for(int k=1;k<=500;++k) {
                lx++,ly--;
                rx++;ry++;
                if(lx<=0||lx>n||rx<=0||rx>n) {
                    break;
                }
                if(ly<0||ly>m||ry<0||ry>m) {
                    break;
                }
                if(a[lx][ly]!=1||a[rx][ry]!=1) {
                    break;
                }
                if(pre[rx][ry]-pre[lx][ly-1]==ry-ly+1) {
                    cnt++;
                }
            }
        }
    }
    cout<<cnt<<endl;
}
posted @ 2024-02-27 16:25  cyyyyyyyyyyyyy  阅读(12)  评论(0)    收藏  举报