暑假补题记 1

发布时间 2023-07-16 16:07:42作者: 畴

 题目意思就是:有n个任务,每一个任务都有K个小任务每一个小任务都有指定时间,之后做完一个大任务额外加一分,然后给你M分钟,问在M分钟里,你需要得到最多分是多少。

题解:首先对K个小任务排个序,对n个大任务进行遍历,就是你做完一个大任务,其他的时间全部搞小任务,然后一个个n进行比较,看看做几个大任务最优进行了

 

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#define int long long
using namespace std;
const int N=1000;
int a[N],b[N];
::int32_t main(){
    int n,k,M;
    cin>>n>>k>>M;
    int aa=0;
    for(int i=1;i<=k;i++)
    {
        cin>>a[i];
        aa+=a[i];
    }
    sort(a+1,a+1+k);
    int sum=0,ans=0,kpl=0,to=0;
    for(int i=0;i<=n;i++)
    {
        kpl=aa*i;
        if(kpl>M)break;
        sum=M-kpl,ans=(k+1)*i;
        for(int j=1;j<=k;j++)
        {
            if(a[j]<=sum)
            {
                int x=sum/a[j];
                if(x>=n-i) x=n-i;
                sum=sum-a[j]*x;
                ans+=x;
                if(j==k) ans+=x;
            }
        }
        to=max(to,ans);
    }
    cout<<to;
    return 0;
}

 题意:在数组中找3个最小的数组成三元组,问有多少个这样小的三元组,其实就是有重复的数字进行选择,然后全排列。

题解:先排列,看看有多少个第3个数在这个数组里,然后就排列即可。

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N=1e6+10;
int a[N];
::int32_t main(){
    int n;
    cin>>n;
    for(int i=1; i<=n; i++)
    {
        cin>>a[i];
    }
    sort(a+1,a+n+1);
    int sum=0;
    for(int i=1; i<=n; i++)
    {
        if(a[i]==a[3]) sum++;
    }
    if(a[1]==a[2]&&a[2]==a[3]){
        cout<<(sum*(sum-1)*(sum-2))/6;
        return 0;
    }
    if(a[2]==a[3]){
        cout<<(sum*(sum-1))/2;
        return 0;
    }
    cout<<sum;
    return 0;
}

 

 

 

题意: 意思就是这个数字的每一位相加原来的数减去即可,然后如果比s大就是一个真正大的数字,然后给一个1到n的区间问这个区间有多少个真正大的数字。

题解:用二分去寻找即可。

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define int long long
using namespace std;
const int N=1e6+10;
int wei(int n){
    int a,ans=0;
    while (n){
        a=n%10;
        ans=ans+a;
        n=n/10;
    }
    return ans;
}
::int32_t main(){
   int n,s;
   cin >> n >> s;
   int l=1,r=n;
    while (l<=r)
    {
        int mid=(l+r)/2;
        if(mid-wei(mid)>=s) r=mid-1;
        else l=mid+1;
    }
   if(r<n)
       cout<<n-l+1;
   else
       cout<<0;
    return 0;
}