• CF #560 div3


    碎碎念

    只想着快了  细节考虑不周,补题时一直就奇怪当时怎么就没这么想呢,

    还有题意,老是会遗漏,英文水平不够呀

    还有特判问题,错误想法前的特判,改掉其他地方后特判也要改呀

    对于数学规律,算出的公式看自己的解决思路来化简

    写写前五题吧  后俩有空补一下

    A:给定01字符串s,长度n,x,y, 0=<x<y<n;可任意对某位取反,问使得s % 10^x == 10^y需进行的最小操作数。

    嘛 简单 保证s的倒数y位都为0就ok了嘛  然后倒数的 x~y位之间也都是0就可以了

    嗯 搞搞, 过了,开心

    早上一看 hacked了

    哇 看了下代码  判断倒数第x位的时候顺手判断了一下该位是否为1, 为0则操作数++,其实保证了s没有前导0 ,x<n,那倒数x位前肯定有1存在,x位是啥就无所谓了 呜

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    #include<list>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> p;
    typedef long double ld;
    #define mem(x) memset(x, 0, sizeof(x))
    #define me(x) memset(x, -1, sizeof(x))
    #define fo(i,n) for(ll i=0; i<n; i++)
    #define sc(x) scanf("%lf", &x)
    #define pr(x) printf("%lld
    ", x)
    #define pri(x) printf("%lld ", x)
    #define lowbit(x) x&-x
    const ll MOD = 1e9 +7;
    const ll N = 6e6 +5;
    ll a[N];
    int main()
    {
        ll i, j, k, l=0;
        ll n, m, t;
        string s;
        ll x, y;
        cin>>n>>x>>y;
        cin>>s;
        ll co=0, ans=0;
        for(i=n-1; i>=0; i--)
        {
     
            if(co==y)
            {
                if(s[i]=='0') ans++;
            }
            else if(co==x)
            {
                //if(s[i]=='0') ans++;
                break;
            }
            else
            {
                if(s[i]=='1')ans++;
            }
            co++;
        }
        cout<<ans<<endl;
        return 0;
    }
    View Code

    B:看懂题意随便搞搞就出来了, 排个序,用l模拟每天要解决的问题数,>=l的安排进来,l再++,安排不进的就不管了 最后输出l-1

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    #include<list>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> p;
    typedef long double ld;
    #define mem(x) memset(x, 0, sizeof(x))
    #define me(x) memset(x, -1, sizeof(x))
    #define fo(i,n) for(ll i=0; i<n; i++)
    #define sc(x) scanf("%lf", &x)
    #define pr(x) printf("%lld
    ", x)
    #define pri(x) printf("%lld ", x)
    #define lowbit(x) x&-x
    const ll MOD = 1e9 +7;
    const ll N = 6e6 +5;
    ll a[N];
    int main()
    {
        ll i, j, k, l=0;
        ll n, m, t;
        string s;
        ll x, y;
        cin>>n;
        for(i=0; i<n; i++) cin>>a[i];
        sort(a,a+n);
        l=1;
        for(i=0; i<n; i++)
        {
            if(a[i]>=l)
            {
     
                l++;
            }
        }
        cout<<l-1<<endl;
        return 0;
    }
    View Code

    C:也是搞搞就行了 没啥要注意的呢

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    #include<list>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> p;
    typedef long double ld;
    #define mem(x) memset(x, 0, sizeof(x))
    #define me(x) memset(x, -1, sizeof(x))
    #define fo(i,n) for(ll i=0; i<n; i++)
    #define sc(x) scanf("%lf", &x)
    #define pr(x) printf("%lld
    ", x)
    #define pri(x) printf("%lld ", x)
    #define lowbit(x) x&-x
    const ll MOD = 1e9 +7;
    const ll N = 6e6 +5;
    ll a[N];
    int main()
    {
        ll i, j, k, l=0;
        ll n, m, t;
        string s;
        cin>>n;
        cin>>s;
        ll co=0;
        for(i=0 ;i<s.size()-1; i+=2)
        {
            j=i+1;
            while(1)
            {
                if(j>=s.size()) break;
                if(s[i]!=s[j]) break;
                s.erase(j,1);
                co++;
            }
        }
        n=s.size();
        if(n%2) s.erase(n-1,1), co++;
        cout<<co<<endl;
        if(s.size())
        cout<<s<<endl;
        return 0;
    }
    View Code

    D:wa了好多发,最后发现问题出在特判上了 呜

    题意:给定某数的除1和自身外的所有因子,找最小的该数,(不确保给定数据真的是某数的除1和自身外所有因子

    简单,排个序,看因子个数奇偶性,若数据正确,a[i]*a[n-i+1] == a[i+1]*a[n-i] 一定成立,奇数个因子就会有一个平方项,一起判断就好

    特判:如果个数为1的话输出该数的平方就好

    若判断后无误,就检查一下该数(a[0]*a[n-1])的所有因子是否都在给定数据里,其实判断sqrt(a[0]*a[n-1])项就好了

    然后 然后 自信满满地交了,wa

    检查n遍,愣是漏了特判那里,给个数据9 直接输出81了但应该输出-1的,还有因子3 27,呜

    改过就好了

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    #include<list>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> p;
    typedef long double ld;
    #define mem(x) memset(x, 0, sizeof(x))
    #define me(x) memset(x, -1, sizeof(x))
    #define fo(i,n) for(ll i=0; i<n; i++)
    #define sc(x) scanf("%lf", &x)
    #define pr(x) printf("%lld
    ", x)
    #define pri(x) printf("%lld ", x)
    #define lowbit(x) x&-x
    const ll MOD = 1e9 +7;
    const ll N = 6e6 +5;
    ll a[N];
    map<ll,ll>mp;
    int main()
    {
        ll i, j, k, l=0;
        ll n, m, t;
        cin>>t;
        while(t--)
        {
            cin>>n;
            mp.clear();
            mem(a);
            ll f=0;
            k=0;
            for(i=0; i<n; i++) cin>>a[i];
            sort(a,a+n);
            mp[a[0]]=1;
            if(n==1)
            {
                k=a[0]*a[0];
                l=sqrt(k);
                //cout<<l<<" "<<k<<endl;
                for(i=2; i<=l; i++)
                {
                    //cout<<"aaa"<<mp[i]<<endl;
                    if(k%i==0)
                    {
                        if(!mp[i])
                        {f=1;break;}
                    }
                }
                if(f)
                {
                    cout<<-1<<endl;
                    continue;
                }
                cout<<k<<endl;
                continue;
            }
            k=a[0]*a[n-1];
            mp[a[0]]=mp[a[n-1]]=1;
            l=a[0];
            if(n%2)
            {
                for(i=1, j=n-2; i<n/2; i++, j--)
                {
                    mp[a[i]]=1;
                    if(a[i]*a[j]!=k)
                    {
                        f=1;break;
                    }
                }
                l=a[i];
                //cout<<"ooo"<<a[i]<<endl;
                mp[a[i]]=1;
                if(a[i]*a[i]!=k)
                    f=1;
                if(f)
                {
                    cout<<-1<<endl;
                    continue;
                }
            }
            else
            {
                for(i=1, j=n-2; i<n/2; i++, j--)
                {
                    mp[a[i]]=1;
                    if(a[i]*a[j]!=k)
                    {
                        f=1;break;
                    }
                }
                l=a[i-1];
                if(f)
                {
                    cout<<-1<<endl;
                    continue;
                }
            }
            l=sqrt(k);
            //cout<<l<<" "<<k<<endl;
            for(i=2; i<=l; i++)
            {
                //cout<<"aaa"<<mp[i]<<endl;
                if(k%i==0)
                {
                    if(!mp[i])
                    {f=1;break;}
                }
            }
            if(f)
            {
                cout<<-1<<endl;
                continue;
            }
            cout<<k<<endl;
        }
        return 0;
    }
    View Code

    E:

    找找规律就好了呢

    时间浪费在题意理解上了

    题意:给定数组长度n 及数组 a, b, 可对数组b任意排序,使得sum (1=<L<=r<=n) (L=<i<=r) a[i]*b[i] 最小

    很简单嘛 a的位置不动,只改b的位置,公式也好理解,当L=1~n时, r=L~n, 对所有r 取 i=L~r 求sum a[i]*b[i] 

    使sum最小的话,逆序匹配,a[ i ]最大匹配 b[ j ]最小,这样求和就最小啦

    呵呵  刚开始理解错误,以为对每个L取值都可以重新排一次b数组,瞎搞了一下,发现测样例不对,一直调来调去都不对

    开始输出数据,发现不对劲,

    再看了两遍题目  好像b位置只能改一次 呜

    最后计算公式 ( n - i + 1 ) * b [ i ] * a [ i ] * i

    这样子 对a排序, 根据位置匹配就好了 wa

    其实要想sum最小, b[i] 得和 a[i]*i*(n-i+1)匹配

    i 和(n-i+1)都是固定值, 直接绑定 a [ i ] 就好了 a[ i ] * = i * ( n - i + 1 )

    wa

    #include<iostream>
    #include<cstdio>
    #include<cstdlib>
    #include<cmath>
    #include<cstring>
    #include<string>
    #include<algorithm>
    #include<map>
    #include<queue>
    #include<stack>
    #include<list>
    #include<set>
    using namespace std;
    typedef long long ll;
    typedef pair<ll,ll> p;
    typedef long double ld;
    #define mem(x) memset(x, 0, sizeof(x))
    #define me(x) memset(x, -1, sizeof(x))
    #define fo(i,n) for(ll i=0; i<n; i++)
    #define sc(x) scanf("%lf", &x)
    #define pr(x) printf("%lld
    ", x)
    #define pri(x) printf("%lld ", x)
    #define lowbit(x) x&-x
    const ll MOD = 998244353;
    const ll N = 3e5 +5;
    struct node
    {
        ll x, id;
    }a[N];
    ll b[N], c[N], d[N];
    bool cmp(node a, node b)
    {
        if(a.x==b.x) return a.id<b.id;
        return a.x<b.x;
    }
    bool cmp1(node a, node b)
    {
        return a.id<b.id;
    }
    int main()
    {
        ll i, j, k, l=0;
        ll n, m, t;
        cin>>n;
        for(i=1; i<=n; i++) cin>>a[i].x, a[i].x*=i*(n-i+1),a[i].id=i, d[i]=a[i].x;
        for(i=1; i<=n; i++) cin>>b[i];
        sort(a+1,a+n+1,cmp);
        sort(b+1,b+n+1);
        for(i=1, j=n; i<=n; i++, j--)
        {
            c[a[i].id]=b[j];
        }
        //for(i=1; i<=n; i++) cout<<d[i]<<" ";cout<<endl;
        //for(i=1; i<=n; i++) cout<<c[i]<<" ";cout<<endl;
        //sort(a+1,a+n+1,cmp1);
        ll ans=0;
        for(i=1; i<=n; i++)
        {
            ans+=(d[i]%MOD*(c[i]%MOD))%MOD;
            ans%=MOD;
            //cout<<ans<<endl;
        }
        if(ans<0) ans+=MOD, ans%=MOD;
        cout<<ans<<endl;
        return 0;
    }
    View Code
  • 相关阅读:
    Codeforces758C
    Codeforces758B
    CodeForces758A
    数据库实习
    数据结构实习-迷宫(基于Qt实现)
    CodeForces757B
    CodeForces757A
    HDU3790
    数据结构实习
    Codeforces374B
  • 原文地址:https://www.cnblogs.com/op-z/p/10870884.html
Copyright © 2020-2023  润新知