欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页

codeforces round #653

程序员文章站 2024-03-14 18:36:53
...

AA
给出x,y,n;
找到最大的k(0<k<n),使得k%x=y.
因为k%x=y;
tx+y=k。t取最大值
n/x
x+y观察是否大于n
若>n则输出(n-1)*x+y
若<n则输出(n+1) *x+y.

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--){
    int x,y,n;
    cin>>x>>y>>n;
    if(n/x*x+y>n)
        cout<<(n/x-1)*x+y<<endl;
    else
        cout<<(n/x)*x+y<<endl;
    }
    return 0;
}

BB
给出n
可以有两种步

  1. 将n*2
  2. 将n/6
    可以看出2和3为n的最小质因子,否则无法将其除为1.
    可以将两部规划成一步为除3
    n/3,只不过其计算步数时仍要进行两步操作。

由此给出代码

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
    int n;
    cin>>n;
    int sum_2=0;
    int sum_3=0;
    while(n%6==0)
    {
        n/=6;
        sum_2+=1;
    }
    while(n%3==0)
    {
        n/=3;
        sum_3+=2;
    }
    if(n==1)
    cout<<sum_3+sum_2<<endl;
    else
    cout<<-1<<endl;
    }
    return 0;
}

CC
给出一个数n
给出n个左括号“(”右括号“)”。
找需要给出的顺序不等,
可进行两种操作

  1. 将括号移到最后面
  2. 将括号移到最前面
    使其成为常规括号
    “()()”、"(())()"、"(()) “和”()) “是常规的括号序列,但”)("、"()(“和”())) "不是

由题意可以得到,该题是寻找非常规括号的个数。

先一步一步将括号配对,将先前出现的“(”存起来,若后有“)”与其配对,则将两括号都消去,最终没有配对的“)”就为需要进行操作的步数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int sum=0;
        int n;
        cin>>n;
        char a[60];
        for(int i=0;i<n;i++)
        {
            cin>>a[i];
        }
        stack <char> b;
        for(int i=0;i<n;i++)
        {
            if(a[i]=='(')
                b.push(a[i]);
            if(a[i]==')')
            {
                if(b.empty())
                    sum++;
                else
                    b.pop();
            }
        }
        cout<<sum<<endl;
    }
    return 0;
}

DD

给出n和k
n为数的个数,k为整除数
开始给出一个x=0;
每步进行两个操作

  1. a[i+1];x++;
  2. x++;
    求其需要使全部的数全部为k的倍数的步数

从0开始到k为一个周期,每个周期中都有对应得数加x刚好得到k的倍数。
每个数需要加的数<k
可以得到每个需要加的数为key=(k-a[i]%k)k

所以只需要求需要加的数相同的a[i]最多的数,因为最后一个周期数N,不是完整的,所以需要加最大的那个key加,得到(N-1)*k+key+1为答案

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
map<int ,int>m;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        m.clear();
        int n;
        cin>>n;
        int num=n;
        int k;
        cin>>k;
        int Max=0;
        for(int i=0;i<n;i++)
        {
            int a;
            cin>>a;
            num=(k-a%k)%k;
            if(num!=0)
                m[num]++;
            if(Max<m[num])
                Max=m[num];
        }
        vector<int> v;
        for(auto[key,value]:m)
            if(value==Max)
                v.push_back(key);
        sort(v.begin(),v.end());
        if(Max!=0)
        cout<<(Max-1ll)*k+v.back()+1<<endl;
        else
            cout<<"0"<<endl;

    }
    return 0;
}

E1E1

给出n本书,男孩和和女孩至少选择k本书
男孩和女孩可以同时看一本。男孩和女孩必须选择自己喜欢的书,每本书的阅读时常为t,男孩喜欢则a=1,女孩喜欢则b=1;

可将选择分为两种

  1. 选择男孩女孩都喜欢的
  2. 选择男孩喜欢的一本,选择女孩喜欢的一本。
    将两种情况进行比较,即可得到最少的阅读时间

非第一种情况则必为第二种情况,所以可将第二种情况进行加工。男孩喜欢和女孩喜欢的书的时间按从小到大的顺序相加存入数组,最后将其与男孩女孩都喜欢的书看的时间存入数组。
将他们按从小到大的顺序排列,找到前k项即可得到最小时间

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<queue>
#include<stack>
#include<map>
#include<vector>
using namespace std;
vector <int>ab,a,b;
int main()
{
    int n,k;
    cin>>n>>k;
    int t,x,y;
    int q=0,e=0;
    int cnt1=0,cnt2=0;
    int sum=0;
    for(int i=0;i<n;i++)
    {

        cin>>t>>x>>y;
        if(x==1&&y==1)
            {
                q++;
                e++;
                ab.push_back(t);
            }
        else if(x==1&&y==0)
            {
                cnt1++;
                q++;
                a.push_back(t);
            }
        else if(x==0&&y==1)
            {
                cnt2++;
                e++;
                b.push_back(t);
            }
    }

    if(q<k||e<k)
    {
        cout<<-1<<endl;
    }
    else
    {
    sort(a.begin(),a.end());
    sort(b.begin(),b.end());
    int min1;
    min1=min(cnt1,cnt2);
    for(int i=0;i<min1;i++)
    {
        ab.push_back(a[i]+b[i]);
    }
    sort(ab.begin(),ab.end());
    for(int i=0;i<k;i++)
    {
        sum+=ab[i];
    }
    cout<<sum<<endl;
    }
    return 0;
}

相关标签: 恰饭