Codeforces Round #697 (Div. 3)

原题链接:https://codeforces.com/contest/1475

A. Odd Divisor

倒着判,每次除2,时间复杂度nlogn

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
    int t;
    cin>>t;
    ll n;
    while(t--)
    {
        int pd=0;
        cin>>n;
        while(n>1)
        {
            if(n%2==1) 
            {
                pd=1;
                printf("YES\n");
                break;
            }
            else n/=2;
        }
        if(pd==0) printf("NO\n"); 
    }
    return 0;
}
View Code

B. New Year's Number

除以2020,记下来商和余数

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        cin>>n;
        if(n<2020) printf("NO\n");
        else 
        {
            int a=n/2020;
            int b=n%2020;
            if(a>=b) printf("YES\n");
            else printf("NO\n");
        }
    }
    return 0;
}
View Code

C. Ball in Berland

对于a,b两组数,ans加上k-numa-numb+1就可以,一开始没有想明白,现场只相出了n方的解法

#include<iostream>
#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
int a[maxn],b[maxn];
int numa[maxn],numb[maxn];
int main()
{
    int t;
    cin>>t;
    int aa,bb,k;
    while(t--)
    {
        memset(numa,0,sizeof numa);
        memset(numb,0,sizeof numb);
        scanf("%d%d%d",&aa,&bb,&k);
        for(int i=1;i<=k;i++) scanf("%d",&a[i]),numa[a[i]]++;
        for(int i=1;i<=k;i++) scanf("%d",&b[i]),numb[b[i]]++; 
        ll ans=0;
        for(int i=1;i<=k;i++) ans+=(k-numa[a[i]]-numb[b[i]]+1);
        cout<<ans/2<<endl;
    }
    return 0;
}
View Code

D. Cleaning the Phone

前缀和+二分答案

E. Advertising Agency

想法是对的,一开始没有看到mod,右边界也算的有问题,WA了好几发

用yxc的模板计算组合数,1013ms 优化到 了15ms  orz

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
const int mod=1e9+7;
int a[1010];
bool cmp(int x,int y)
{
    return x>y;
}
ll c[1010][1010];
// c[a][b] 表示从a个苹果中选b个的方案数

int main()
{
    for (int i = 0; i < 1010; i ++ )
    for (int j = 0; j <= i; j ++ )
        if (!j) c[i][j] = 1;
        else c[i][j] = (c[i - 1][j] + c[i - 1][j - 1]) % mod;
    int t;
    cin>>t;
    int n,k;
    while(t--)
    {
        memset(a,0,sizeof a);
        scanf("%d%d",&n,&k);
        for(int i=1;i<=n;i++) scanf("%d",&a[i]);
        sort(a+1,a+n+1,cmp);
        int l=k,r=k+1;
        while(a[k]==a[l-1]&&l>1) l--;
        while(a[k+1]==a[r+1]&&r<n) r++;
//        cout<<"       "<<l<<" "<<r<<" "<<a[k]<<endl;
        if(a[k]!=a[k+1]||k==n) cout<<1<<endl;
        else
        {
            int aa=r-l+1,bb=k-l+1;
            cout<<c[aa][bb]<<endl;
        }
    }
    return 0;
}
View Code

 

自古表白多白表

向来情书难书情

笑谈少年真年少

常与生人话人生

posted @ 2021-01-26 11:11  standard_zsz  阅读(78)  评论(0)    收藏  举报