zoukankan      html  css  js  c++  java
  • AIM Tech Round 4 (Div. 2)ABCD

    这一场真的是血崩,a,b都被hack,还好结束前重交都过了

    A:题意:找出得到k个不同的字符,所要更改的最小字符数

    题解:首先如果k>字符串长度,直接impossible,然后直接记录一下不重复的有多少个,如果不重复的个数比k小,输出k-不重复的个数,否则输出0(就是这里被hack)

    #include<bits/stdc++.h>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=300000+10,maxn=100+10,inf=0x3f3f3f3f3f;
    
    bool vis[30];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        string s;
        cin>>s>>n;
        int ans=0;
        for(int i=0;i<s.size();i++)
        {
            if(!vis[s[i]-'a'])
            {
                vis[s[i]-'a']=1;
                ans++;
            }
        }
        if(n>s.size())cout<<"impossible"<<endl;
        else cout<<max(0,n-ans)<<endl;
        return 0;
    }
    /********************
    
    ********************/
    A

    B:题意:给一个n*m的数字(0,1)矩阵,求能组成团的有多少(每一个团里元素值相同,而且在同一行或同一列)

    题解:对每一行和每一列计算1的个数(k),这样每一行(列)里1构成的团有(1<<k)-1个(可以分1,2,,,k)来列举出,0构成的有(1<<(m(列就是n)-k))-1

    但是最大到了(1<<50)会爆longlong(就是这里被hack了)(后来实在脑残了直接改写成python交上去过了,之后发现原来把1改成1ll就能过了)

    n,m = input().strip().split()
    n = int(n)
    m = int(m)
    a = [([0]*50) for i in range(50)]
    for i in range(n):
        p=input()
        a[i] = p.split(' ')
    ans = 0
    for i in range(n):
        k = 0
        for j in range(m):
            if a[i][j] == '1':
                k = k+1
        ans=ans+2**k-1+2**(m-k)-1
    for i in range(m):
        k = 0
        for j in range(n):
            if a[j][i] == '1':
                k = k+1
        ans=ans+2**k-1+2**(n-k)-1
    print(ans-n*m)
    B---python
    #include<bits/stdc++.h>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=50+10,maxn=1000000+10,inf=0x3f3f3f;
    
    int a[N][N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        ll n,m;
        cin>>n>>m;
        for(int i=1;i<=n;i++)
            for(int j=1;j<=m;j++)
                cin>>a[i][j];
        ll ans=-n*m;
        for(int i=1;i<=n;i++)
        {
            ll k=0;
            for(int j=1;j<=m;j++)
                if(a[i][j]==1)
                    k++;
            ans+=(1ll<<k)-1;
            ans+=(1ll<<(m-k))-1;
        }
        for(int i=1;i<=m;i++)
        {
            ll k=0;
            for(int j=1;j<=n;j++)
                if(a[j][i]==1)
                    k++;
            ans+=(1ll<<k)-1;
            ans+=(1ll<<(n-k))-1;
        }
        cout<<ans<<endl;
        return 0;
    }
    /********************
    
    ********************/
    B---c++

    C:题意:给定一个数列,要求对其中某些数排序,排完序之后放在对应的位置,然后每个数最多排一次,要求排的次数最多,而且排完之后整个数列递增
    题解:先对其排序,按照下标的顺序去找到最小的那个团,比如3 1 2,3应该放在2的位置,那么就再取2,2应该放在1的位置那么取1,则最小团就是1,2,3

    #include<bits/stdc++.h>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=100000+10,maxn=100+10,inf=0x3f3f3f3f3f;
    
    int a[N],b[N];
    bool vis[N];
    map<int,int>m;
    vector<int>v[N];
    int main()
    {
        ios::sync_with_stdio(false);
        cin.tie(0);
        int n;
        cin>>n;
        for(int i=1;i<=n;i++)
        {
            cin>>b[i];
            a[i]=b[i];
        }
        sort(b+1,b+1+n);
        for(int i=1;i<=n;i++)m[b[i]]=i;
        int cnt=0;
        for(int i=1;i<=n;i++)
        {
            if(!vis[i])
            {
                ++cnt;
                int p=i;
                while(m[a[p]]!=i){
                    vis[m[a[p]]]=1;
                    v[cnt].push_back(m[a[p]]);
                    p=m[a[p]];
                }
                v[cnt].push_back(m[a[p]]);
            }
        }
        cout<<cnt<<endl;
        for(int i=1;i<=cnt;i++)
        {
            cout<<v[i].size();
            for(int j=0;j<v[i].size();j++)
                cout<<" "<<v[i][j];
            cout<<endl;
        }
        return 0;
    }
    /********************
    
    ********************/

    D:题意:交互题,给定一个链表,每次查询时会给你当前结点的价值和下一个节点的坐标,询问的是坐标,链表价值递增,要求找到最小的大于等于x的那个价值,且询问次数不超过2000次

    题解:先生成一个随机数组,然后访问前1600个,找到最大的小于等于x的那个坐标,然后沿着那个坐标走,就能得到结果了(刚开始直接访问了不随机的前1500个导致wa了,然后随机数种子忘了写又wa了)srand(time(NULL));

    #include<bits/stdc++.h>
    #define C 0.5772156649
    #define pi acos(-1.0)
    #define ll long long
    #define mod 1000000007
    #define ls l,m,rt<<1
    #define rs m+1,r,rt<<1|1
    #pragma comment(linker, "/STACK:1024000000,1024000000")
    
    using namespace std;
    
    const double g=10.0,eps=1e-7;
    const int N=50000+10,maxn=100+10,inf=0x3f3f3f3f3f;
    
    int main()
    {
        srand(time(NULL));
        ios::sync_with_stdio(false);
        cin.tie(0);
        int st,n,x;
        cin>>n>>st>>x;
        vector<int>v;
        for(int i=0;i<n;i++)
            v.push_back(i+1);
        random_shuffle(v.begin(),v.end());
        int ans=-1,p=st;
        for(int i=0; i<min(n,1600); i++)
        {
            cout<<"? "<<v[i]<<endl;
            cout.flush();
            int v,id;
            cin>>v>>id;
            if(v>ans&&v<=x)
            {
                p=id;
                ans=v;
            }
        }
        while(p!=-1&&ans<x)
        {
            cout<<"? "<<p<<endl;
            cin>>ans>>p;
        }
        if(ans<x)ans=-1;
        cout<<"! "<<ans<<endl;
        cout.flush();
        return 0;
    }
    /********************
    
    ********************/
  • 相关阅读:
    问题-[DelphiXE2]提示第三控件不存在
    问题-[DelphiXE2]编译程序体积大的问题
    问题-[delphi2007、2010]无法二次启动,报EditorLineEnds.ttr被占用,进程一直有bds.exe?
    问题-[VMware Workstation]断电后,重启电脑,之后就提示“内部错误”
    问题-[Delphi]通过Map文件查找内存地址出错代码所在行
    问题-[WIN8.132位系统]安装Win8.1 遇到无法升级.NET Framework 3.5.1
    问题-[DelphiXE7]新建的安桌模拟器运行程序闪退
    问题-[Delphi]用LoadLibrary加载DLL时返回0的错误
    问题-[Access]“无法打开工作组信息文件中的表 'MSysAccounts'”的问题的解决方法
    教程-Delphi 调用控制面板设置功能
  • 原文地址:https://www.cnblogs.com/acjiumeng/p/7426861.html
Copyright © 2011-2022 走看看