暑假补题记 1

 题目意思就是:有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;
}

 Problem - A - Codeforces

题意:就是在一个n*m的图里,有k个小伙伴和一个我,每分钟每个人都要走一步到上下左右相邻的房间中,给你我的位置和K个人的位置,问你能不能不被抓到。

题解:就是如果这k个人初始位置如果不在对角线上即可。

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define int long long
using namespace std;
const int N=1e6+7;
int32_t main()
{
    int t;
    cin>>t;
    int n,m,k;
    while (t--)
    {
        cin>>n>>m>>k;
        int x,y;
        cin>>x>>y;
        int f=0;
        for(int i=1;i<=k;i++)
        {
            int xx,yy;
            cin>>xx>>yy;
            if((x+y) % 2 == (xx+yy) % 2)
            {
                f=1;
            }
        }
        if(!f)
        {
            cout<<"YES"<<endl;
        }
        else
            cout<<"NO"<<endl;
    }
    return 0;
}

 L-Look Up_第二周训练题单 (nowcoder.com)

题意:对比后者和前者身高,如果最近的一个身高高于他则输出下标,没有则输出0.

题解:用一个stack如果为空打0,否则对比当前数小的全部出栈即可。

#include <bits/stdc++.h>
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#include <queue>
#include <cmath>
#define int long long
using namespace std;
const int N=1e6+7;
int a[N],c[N];
int32_t main()
{
    stack <int> b;
    int n;
    cin>>n;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
    }
    for(int i=n;i>=1;i--)
    {
        while (b.size()!=0 && a[b.top()]<=a[i]) b.pop();
        if(b.size()==0)
        {
           c[i]=0;
        }
        else
        c[i]=b.top();
        b.push(i);
    }
    for(int i=1;i<=n;i++)
    {
        cout<<c[i]<<endl;
    }
    return 0;
}

 

posted @ 2023-07-16 16:02  whatdo+  阅读(11)  评论(0编辑  收藏  举报