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;
}
/********************

********************/

 

posted @ 2017-08-25 10:39  walfy  阅读(178)  评论(0编辑  收藏  举报