2023级HUT创新创业中心实验室第四次面试题解

A:

略,a*b

B:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int mod=1e9+7;

ll n, m;

int main(void)
{
    cin>>n>>m;
    //余数相关知识点:( n%mod * m%mod )%mod == (n*m)%mod 
    cout<<(n%mod)*(m%mod)%mod<<endl;
    return 0;
}

C:

略,判断总和的奇偶即可

D:

#include<bits/stdc++.h>
using namespace std;
const int N=100010;

int n, sum=0;
int a[N];

int main(void)
{
    cin>>n;
    for(int i=1; i<=n; ++i)
    {
        cin>>a[i];
        a[i] %= 2;//因为只需要判断最终可操作次数sum的奇偶,所以每次都对2取模不影响最后的奇偶
        sum += a[i];
    }
    sum += n-1;//可以选择合并的次数为n-1次
    //如果结果是奇数,就可以取胜,否则不能
    if(sum%2==1) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

E:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;

int n, ans=1;//ans统计最大长度
int a[N];

int main(void)
{
    cin>>n;
    int cnt = 1;//cnt统计当前满足条件的子数组长度
    for(int i=1; i<=n; i++) cin>>a[i];
    for(int i=2; i<=n; i++)
    {
        if(a[i] >= a[i-1]) {//
            cnt++;//符合,当前长度加1
            ans = max(ans, cnt);//用max更新ans的值
        }else {
            ans = max(ans, cnt);//不符合,用max更新ans
            cnt = 1;//将cnt重置为1
        }
    }
    cout<<ans<<endl;
}

F:

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

int n;
int a, b;//a,b用来统计手里25,50的张数

int main(void)
{
    cin>>n;
    bool f=1;
    for(int i=1; i<=n; ++i)
    {
        int x; cin>>x;
        if(x==25) a++;//如果为25,手里25的张数+1
        else if(x==50) a--, b++;//如果为50,手里25的张数-1,50的张数+1
        else a--, b--;//如果为100,手里25,50的张数各-1
        if(b<0) a += b*2, b=0;//如果因为给100找零钱b<0了,则不足的用a的张数付款
        if(a<0) {f=0; break;}//如果a的张数也不够了,那么将无法找零,跳出循环
    }
    if(f) cout<<"YES"<<endl;
    else cout<<"NO"<<endl;
}

G:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200010;

string s;

int main(void)
{
    int t; cin>>t;
    while(t--)
    {
        cin>>s;
        int ans=0;//存放字母对(aa,bb等)的个数
        int cnt[30]={0};//用来存放26个英文字母出现的次数
        int len=s.length();//字符串的长度
        for(int i=0; i<len; ++i)
        {
            cnt[s[i]-'a']++;//每次该字母的出现次数+1
            if(cnt[s[i]-'a']%2==0 && cnt[s[i]-'a']!=0) {//如果统计出来是偶数且不为0时
                ans += 1;//字母对数+1
                for(int i=0; i<26; ++i) cnt[i]=0;//将cnt清空,因为前面出现的字符全部要删掉
            }
        }
        cout<<len-ans*2<<endl;//需要删掉的字符数就等于 原长度-字符对数*2
    }
    return 0;
}

 

H:

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=100010;

int n, m;
ll a[N], b[N];

int main(void)
{
    cin>>n>>m;
    for(int i=1; i<=n; ++i) cin>>a[i];
    for(int i=1; i<n; ++i) b[i] = a[i+1]-a[i];//将每两个数的差值记录到b数组中
    ll sum = a[n]-a[1];//sum记录总差值
    sort(b+1, b+n, greater<int>());//将差值排序,大的放前面
    for(int i=1; i<m; ++i) sum-=b[i];//把前m-1大的差值全部剔除
    cout<<sum<<endl;
    return 0;
}

I:

#include<bits/stdc++.h>
using namespace std;
const int N=1000010;

int n;
int a[N];
long long sum=0;//sum记录总和

signed main(void)
{
    cin>>n;
    for(int i=1; i<=n; ++i) cin>>a[i], sum += a[i];
    if(sum%n==0) {cout<<0<<endl; return 0;}//如果能整除人数,则花费0力气
    int res = sum%n;//不能整除时,求余数
    cout<<min(res, n-res)<<endl;//输出 余数 和 人数-余数 的最小值
    return 0;
}

J:

这题处于某处不可抗拒因素只好上我的抽象代码了

#include<bits/stdc++.h>
using namespace std;
#define ios ios::sync_with_stdio(0); cin.tie(0), cout.tie(0)
#define endl '\n'
#define rs u<<1
#define ls u<<1|1
#define lowbit(x) (x&(-x))
#define sz(a) ((int)a.size())
#define len(a) ((int)a.length())
#define all(a) a.begin(), a.end()
#define bg(a) a.begin()
#define ed(a) a.end()
#define pb push_back
typedef long long ll;
typedef vector<int> vi;
typedef vector<ll> vll;
typedef vector<double> vd;
typedef vector<vi> vvi;
typedef vector<vll> vvll;
typedef vector<vd> vvd;
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
typedef pair<double, double> pdd;
typedef vector<pii> vii;
typedef vector<pll> vllll;
typedef vector<pdd> vdd;
const int N=10000010, mod=1e9+7;
const double eps=1e-6;


struct st {
    ll x, y;
};

int n, m;
ll a[N];


void solve()
{
    cin>>n>>m;
    //先做一个预处理,用前缀和统计区间[1,i]的很2的数的数量存放到a[i]中
    for(int i=1; i<=n; ++i)
    {
        a[i]=a[i-1];
        ll tmp=i;
        bool f=0;
        do {
            if(tmp%10==2) {f=1; break;}
        }while(tmp/=10);
        if(f) a[i] += 1;
    }
    for(int i=1; i<=m; ++i)//区间查找[l,r]中很2的数:[1,r]中很2的数 - [1,l-1]中很2的数,即a[r]-a[l-1]
    {
        ll l, r; cin>>l>>r;
        cout<<a[r]-a[l-1]<<endl;
    }
}

signed main(void)
{
    ios;
    int t=1;// cin>>t;
    while(t--) solve();
    return 0;
}


因为代码实在过于抽象,我放一个没有问题,但是牛客上会超时的代码(我也不明白把我的预处理删了之后为什么会超时?) 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=1000010;

int n, m;
ll a[N];

int main(void)
{
    ios::sync_with_stdio(0); cin.tie(0), cout.tie(0);//解绑定提高cin,cout的速度,或者用scanf和printf。
    cin>>n>>m;
    for(int i=1; i<=n; ++i)//先做一个预处理,用前缀和统计区间[1,i]的很2的数的数量存放到a[i]中
    {
        a[i]=a[i-1];
        ll tmp=i;
        bool f=0;
        do {
            if(tmp%10==2) {f=1; break;}//如果满足很2,跳出循环
        }while(tmp/=10);
        if(f) a[i] += 1;
    }
    for(int i=1; i<=m; ++i)//区间查找[l,r]中很2的数:[1,r]中很2的数 - [1,l-1]中很2的数,即a[r]-a[l-1]
    {
        ll l, r; cin>>l>>r;
        cout<<a[r]-a[l-1]<<endl;
    }
    return 0;
}

K:

略,循环打印

L:

略,排序或找最大数

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值