Codeforces Round #697 (Div. 3)

//持续更新中 持续学习中
A.奇数除法器
测试时间限制2秒
测试存储器限制256兆字节
输入标准输入
输出标准输出
你有一个整数n。请检查是否n有一个奇数除以一个不同的单位)((
例如,如果n=6,则存在x=3。如果n=4,那么这个数字不存在。
输入数据
第一行包含一个整数t≤1≤t≤104)-输入数据集的数量。接下来是t输入数据集。
每个输入数据集包含一个整数n≤2≤n≤1014。
请注意,某些输入数据集中的数字不需要32位整数型,因此,您必须至少使用64位整数语言。
输出数据
每个输入数据集在一个单独的行显示:
“Yes”,如果n有一个非1的奇数除法器;
“NO”否则。
你可以推断出“Yes”和“no”在任何寄存器)例如,线,是的,Yes和Yes将被确认为一个积极的答案。
例子
输入数据
6
2
3
4
5
998244353
109951627776
周末数据
NO
Yes
NO
Yes
Yes
NO

思路
判断有没有奇数因子
这个题很bug
奇数就是yes
不用管素数 自己也是因子

然后如果这个数是2的次幂
那么就是
yes

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue <int,vector<int>,less<int> > q;
priority_queue <int,vector<int>,greater<int> > pp;
vector <int> aa;
const int maxn=1e6+888;
const int N=1e6+1888;
int p[maxn];
int b[maxn];
ll sum=0,bn;
char s[1000007];
char c[maxn];
ll n,m;  int jin=0,w=1;
int pan(ll n)
{
    
    
    for(int i=2;i<=sqrt(n);i++)
    {
    
    
        if(n%i==0)
            return 0;
    }
    return 1;
}
int main ()
{
    
    
    cin>>n;
    while(n--)
    {
    
    
        cin>>m;
            int flag=0;
            ll op=1;
            for(int i=1;i<=63;i++)
            {
    
    
                op*=2;
                if(op==m)
                {
    
    
                    flag=1;
                    printf("NO\n");
                    break;
                }
            }
            if(flag==0)
                printf("YES\n");
        }
 
    return 0;
}

B.年数
测试时间限制2秒
测试存储器限制256兆字节
输入标准输入
输出标准输出
поликару记得2020年,他很高兴来到2021年。为了记住这样一个美妙的时刻,polikarp希望以2020年一些数字和2021一些数字的总和的形式提出n号。
例如,如果:
n=4041,n号以2020+2021的形式表示;
n=4042,n数表示为2021+2021;
n=8081,n号表示为2020+2020+2020+2021;
n=8079,n号不能用2020和2021的数值表示。
帮助полика了解,n号可以是一些2020年数字和2021年数字的总和。
输入数据
第一行包含一个整数t≤1≤t≤104)-输入数据集的数量。接下来是t输入数据集。
每个输入数据集包含一个整数(n)≤1≤n≤106)≤多鲤希望提出2020和2021的数字。
输出数据
每个输入数据集在一个单独的行显示:
“YES”,如果n数是2020年某一数字和2021年某一数字的总和;
“NO”否则。
你可以推断出“Yes”和“no”在任何寄存器)例如,线,是的,Yes和Yes将被确认为一个积极的答案。
例子
输入数据
5
1
4041
4042
Intel 8081
Intel 8079
周末数据
NO
Yes
Yes
Yes
NO

思路
不说了吧 看代码

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
priority_queue <int,vector<int>,less<int> > q;
priority_queue <int,vector<int>,greater<int> > pp;
vector <int> aa;
const int maxn=1e6+888;
const int N=1e6+1888;
int p[maxn];
int b[maxn];
ll sum=0,bn;
char s[1000007];
char c[maxn];
ll n,m;  int jin=0,w=1;
int main ()
{
    
    
 
   scanf("%lld",&n);
   while(n--){
    
    
        int flag=0;
      scanf("%lld",&m);
     int t=m%2020;
     int s=m/2020;
     if(s>=t)
        printf("YES\n");
     else
        printf("NO\n");
   }
    return 0;
}

C.Berliandia的舞会
测试时间限制2秒
测试存储器限制256兆字节
输入标准输入
输出标准输出
瓦夏学校正在筹备毕业典礼。计划中的一项活动是举办一个由男孩和女孩组成的夫妇参加的舞会。
每个班都要介绍两对。瓦夏班有一名男孩和一名b名女孩表示希望参加活动。但不是所有的男孩,不是所有的女孩都愿意一对跳舞。
从技术上讲,你知道k可能的夫妇,由一个男孩和一个女孩。你必须选择两个这样的夫妇,没有人在一对以上。
例如,如果a=3,b=4,k=4和以下几对愿意一起跳舞的人)【1,2’,)1,3’,(2,2’,)3,4),每对夫妇中的第一个是男孩的号码,然后是女孩的号码以下是两对可能的组合)(
(1.3)和)2.2。
(3.4)和(1.3)。
但下列组合是不可能的:
(1.3)和(1.2)-第一个男孩同时进入两对;
(1.2)和(2.2)-第二个女孩同时进入两对;
找到一些方法来选择两对以上的条件下。两种方法被认为是不同的,如果是由不同的蒸汽。
输入数据
第一行包含一个整数t≤1≤t≤104)-输入数据集的数量。接下来是t输入数据集。
每一组输入数据的第一行包含三个整数(a,b和k)≤1≤a,b,k≤2≤105)的班级中的男孩和女孩数量和愿意一起跳舞的夫妇数量。
每一组输入数据的第二行包含k整数a1,a2………。1≤ai≤a≤其中ai-一对中的男孩编号i。
在每一个输入数据集的第三行,包含k整数整数b1.b2©bk©1≤bi≤b,其中的bi-女孩数与i号对。
确保所有输入数据集的a、b和k的数额不超过2±105。
确保每一对夫妇在一个输入数据集中指定不超过一次。
输出数据
每个输入数据集,在一个单独的行显示一个整数-选择两对以上条件下的方法的数量。
例子
输入数据
3
3 4
1 2 3
2 3 2 4
1 1
1
1
2 2 4
1 1 2
1 2 2 2
周末数据
4
0
2
说明
在第一组输入数据集,以下两对组合适合:
(1.2)和)3.4。
(1.3)和)2.2。
(1.3)和)3.4。
(2,2)和(3,4)。
第二组输入数据只有一对。
在第三组输入数据,以下两对组合适合:
(1.1)和)2.2。
(1,2)和)2,1。

思路

把男的出现的次数 跟女的出现的次数记录下来
然后判断多少种组合的时候 减去含当前男女的组合 除了自己
然后会多算出来一倍 结果除一下

#include<bits/stdc++.h>
int cnt=0;
using namespace std;
typedef long long ll;
const int maxn=1e6+199;
int len1,len2,len3;
ll a[maxn];
ll b[maxn]={
    
    0};
ll c[maxn];
ll d[maxn]={
    
    0};
int k;
ll n,m,l;
int sum=0;
int main(){
    
    
  scanf("%lld",&n);
  while(n--){
    
    
 
        scanf("%lld%lld%lld",&m,&k,&l);
        for(int i=1;i<=m;i++)   c[i]=0;
        for(int i=1;i<=k;i++)   d[i]=0;
        for(int i=1;i<=l;i++)
        {
    
    
            scanf("%lld",&a[i]); c[a[i]]++;
        }
        for(int i=1;i<=l;i++)
        {
    
    
            scanf("%lld",&b[i]);
            d[b[i]]++;
        }
        ll ans=0;
        for(int i=1;i<=l;i++)
        {
    
    
            ans+=l-c[a[i]]-d[b[i]]+1;
        }
        printf("%lld\n",ans/2);
  }
    return 0;
}

D.清理手机
测试时间限制为1秒
测试存储器限制256兆字节
输入标准输入
输出标准输出
polikarp经常使用自己的智能手机。他已经安装了n个应用程序。我的应用程序需要一个存储单元。
最近,polikarp不得不安装一个新的应用程序在他的智能手机。然而,安装要求至少释放m个单位)【删除某些应用程序】。
当然,对于polikarpa的一些应用程序比别人更重要。他提出了一个评估系统,每一个应用程序,他比较了一个整数的BI:
bi=1-普通应用程序;
bi=2是一个重要的应用程序。
在这样的评价系统,他的电话有b1+b2+方便。
polikarp认为,如果他删除应用程序的i1.i2。……,ik,he’il释放ai1+ai2+。+aik存储单元,并失去比1+bi2+。+bik点方便。
例如,如果n=5,m=7,a=[5,3,2,1,4],b=[2,1,1,2,1],那么多鲤可以删除下列应用程序集(
附件1.4和5。在这种情况下,它将释放a1+a4+a5=10个内存单位,并将失去b1+b4+b5=5点方便;
附件1和3。在这种情况下,he’il释放a1+a3=7个单位的内存,并将失去b1+b3=3点的舒适。
附件2和5。在这种情况下,he’il释放a2+a5=7个单位的内存和失去b2+b5=2点的舒适。
帮助polikarpa,选择一个应用程序集,删除至少m的内存单位,并将失去最小的分数的方便或指定,有没有这样的集。
输入数据
第一行包含一个整数t≤1≤t≤104)-输入数据集的数量。接下来是t输入数据集。
每个输入数据集的第一行包含两个完整的数字n和m)≤1 n≤2≤105,1≤m≤109)-多个应用程序的数量和内存单位,需要释放。
每一组输入数据的第二行包含n整数a1,a2≤1≤ai≤109)应用程序占用的存储单元数。
每一组输入数据的第三行包含n整数b1,b2。(……)1≤bi≤2)每个应用程序的评价。
保证所有输入数据集的n值不超过2±105。
输出数据
每个输入数据集在一个单独的行显示:
如果没有一套应用程序,删除至少m个存储单元;
最小数量的眼镜的方便,多胞胎将丢失,如果有这样一个集。
例子
输入数据
5
5 7
5 3 2 1 4
2 1 2 2
1 3
2
1
5 10
2 3 2 3 2
1 2 2 2 1
4 10
5 1 3
1 2 2 2
4 5
3 2 1 2
2 2 2 1
周末数据
2
页:1
6
4
3
说明
在第一个输入数据集,最好的方法是删除应用程序编号2和5,释放7个存储单元。b2+b5=2.
在第二个输入数据集,删除唯一的应用程序polikarp只能从3个必要的两个内存单位。
在第三组输入数据中,最好的方法是删除应用程序编号1,2,3和4,释放10个存储单元。b1+b2+b3+b4=6.
在第四个输入数据集,最好的方法是删除应用程序编号1,3和4,释放12个存储单元。b1+b3+b4=4.
在第五个输入数据集,最好的方法是删除应用程序编号1和2,释放5个存储单元。b1+b2=3.

思路
如果全部加起来都不够m
那么就是-1

然后把重要度为 1的单独存起来
重要度为2的单独存起来
然后排一下序(升序) 这样保证效率最大
利用前缀和
把他们包装起来

然后我从重要度为1的循环从删掉前0个开始 一直到删除完
如果删掉的不够m 那么 就while 从重要度为2的里面找恰好和重要度为1的加起来恰好>=m的数
找的时候利用二分,不然会t
别问为啥 我t了

#include<bits/stdc++.h>
int cnt=0;
using namespace std;
typedef long long ll;
const int maxn=1e6+199;
ll b1[maxn];
ll b2[maxn];
ll a[maxn];
ll sum=0;
int i=0,j=0;
int a1=0,a2=0;
ll n,m,l;
int cmp(int a,int b)
{
    
    
    return a>b;
}
int main(){
    
    
    int T;cin>>T;
    while(T--)
    {
    
    
        cin>>n>>m;   //n个  去除m重
        sum=0;a1=a2=0;
        for(i=1;i<=n;i++)
        {
    
    
            cin>>a[i];
            sum+=a[i];
        }
 
        for(i=1;i<=n;i++)
        {
    
    
            int x; cin>>x;
            if(x==1)
                b1[++a1]=a[i];
            else
                b2[++a2]=a[i];
        }
          if(sum<m)
        {
    
    
            cout<<-1<<endl;
            continue;
        }
 
        sort(b1+1,b1+1+a1,cmp);
        sort(b2+1,b2+1+a2,cmp);
        for(i=1;i<=a1;i++)
        {
    
    
            b1[i]=b1[i]+b1[i-1];
        }
        for(i=1;i<=a2;i++)  b2[i]=b2[i-1]+b2[i];
        ll maxx=1000000000;
        for(i=0;i<=a1;i++)
        {
    
    
            ll sum=b1[i];
            if(i>1&&b1[i-1]>m)
                break;
            int k=0;
            int left=1,right=a2,mid=0;
            if(sum<m)
            {
    
    
                mid=(left+right)/2;
                while(left<right)
                {
    
    
                    if(sum+b2[mid]>m)
                        right=mid;
                    else if(sum+b2[mid]<m)
                        left=mid+1;
                    else
                        break;
                    mid=(left+right)/2;
                }
                if(b2[mid]+sum<m)
                    continue;
                sum+=b2[mid];
            }
             if(sum<m)
                continue;
            ll bn=i+mid*2;
            if(bn<maxx)
                maxx=bn;
 
        }
        cout<<maxx<<endl;
 
    }
    return 0;
}

猜你喜欢

转载自blog.csdn.net/qq_52172364/article/details/113287120
今日推荐