patクラスAハッシュ

A 1145

//注意: 如果查找了 TSize 次,每次查找的位置上均有数,但都不等于要查找的数,则认为查找时间是 TSize+1。 
//如果查找某个数,不是之前所要存储的数字列表中的数字,则也是要计算查找次数,也就是一直到某个位置值为空
#include<iostream>
using namespace std;

const int maxn=11111;

int msize,n,m;

int h[maxn];

bool isPrime(int x)
{
    
    
    if(x==1)
        return false;

    for(int i=2; i*i<=x; i++)
        if(x%i==0)
        {
    
    
            return false;
        }
    return true;

}

int find(int x,int &cnt)        //find函数作用是返回合适的x的位置,在该函数中同时也能记录查找x的次数
{
    
    
    int s=x%msize;    //s为x求余msize

    cnt=1;

    for(int k=0; k<msize; k++,cnt++)
    {
    
    
        int t=(s+k*k)%msize;     
   /*
   	对于插入数字而言,如果算出来h[t]为0,则表示该位置还没有值插入,则返回t;如果对于查找数字而言,这里的值如果h[t]为0,表示该数字压根就没有比如样例中的2,则它的查找次数就是为对应的cnt
	后面的h[t]==x表示,如果插入数字时,如果之前插入了x,则直接返回位置,对于查找数字而言,就是在t这个位置找到了x,然后直接返回就行,这里的cnt已经自动记录了查找次数
	*/     
        if(!h[t] || h[t]==x)     
            return t;
    }

    return -1;
}

int main()
{
    
    
    cin >> msize >> n >> m;

    while(!isPrime(msize))
    {
    
    
        msize++;
    }

    for(int i=0; i<n; i++)
    {
    
    
        int x,count;
        cin >> x;
        if(find(x,count)==-1)
        {
    
    
            printf("%d cannot be inserted.\n",x);
        }
        else
            h[find(x,count)]=x;
    }
    int cnt=0;
    for(int i=0; i<m; i++)
    {
    
    
        int x,count;
        cin >> x;
        find(x,count);
        cnt+=count;
    }
    printf("%.1lf\n",(double)cnt/m);
    return 0;
}

2番目の検出方法:

ここに画像の説明を挿入

A1137

#include<iostream>
#include<map>
#include<algorithm>
#include<cmath>
using namespace std;

const int maxn=10123;

struct node
{
    
    
    int program;
    int qizhong;
    int qimo;
    int fina;
    node(): program(-1),qizhong(-1),qimo(-1),fina(-1) {
    
    }      //这里使用一个构造函数将所有成绩进行初始化
};

map<string,node> student;

struct node1
{
    
    
    string name;
    int grade;
}Node1[maxn];

int p,m,n;

bool cmp(node1 a, node1 b)
{
    
    
    if(a.grade!=b.grade)
        return a.grade>b.grade;
    return a.name<b.name;
}

int main()
{
    
    
    cin >> p >> m >> n;
    string temp1;
    int temp2;
    for(int i=0; i<p; i++)
    {
    
    
        cin >> temp1 >> temp2;
        student[temp1].program=temp2;
    }
    for(int i=0; i<m; i++)
    {
    
    
        cin >> temp1 >> temp2;
        student[temp1].qizhong=temp2;
    }
    for(int i=0; i<n; i++)
    {
    
    
        cin >> temp1 >> temp2;
        student[temp1].qimo=temp2;
    }

    int renshu=0;

    for(map<string,node>::iterator it=student.begin(); it!=student.end(); it++)
    {
    
    
        double G;
        if(it->second.qizhong>it->second.qimo)
            G=round(it->second.qizhong*0.4+it->second.qimo*0.6);
        else
            G=it->second.qimo;
        if(it->second.program>=200 && G>=60)
        {
    
    
            it->second.fina=G;
            Node1[renshu].name=it->first;
            Node1[renshu].grade=it->second.fina;
            renshu++;
        }
    }
    sort(Node1,Node1+renshu,cmp);
    for(int i=0; i<renshu; i++)
    {
    
    
        cout << Node1[i].name << " " << student[Node1[i].name].program << " " <<  student[Node1[i].name].qizhong << " " << student[Node1[i].name].qimo << " " << Node1[i].grade << endl;

    }
    return 0;
}

A1149

#include<iostream>
#include<unordered_set>
using namespace std;

const int maxn=10010;

int n,m;

int a[maxn],b[maxn];

int main()
{
    
    
    cin >> n >> m;
    for(int i=0; i<n; i++)
    {
    
    
        cin >> a[i] >> b[i];
    }
    int temp,temp1;
    while(m--)
    {
    
    
        cin >> temp;
        unordered_set<int> S;      //每次判断完重新放值
        for(int i=0; i<temp; i++)
        {
    
    
            cin >> temp1;
            S.insert(temp1);
        }
        bool flag=true;
        for(int i=0; i<n; i++)
        {
    
    
            if(S.count(a[i]) && S.count(b[i]))   //在s中查找a[i]是否存在,存在则放回1,否则返回0,如果在s中找到违禁品就是false
            {
    
    
                flag=false;
                break;
            }
        }
        if(flag)
            cout << "Yes" << endl;
        else
            cout << "No" << endl;
    }
    return 0;
}

A1144

#include<iostream>
#include<set>
using namespace std;

int n;

set<int> a;

int main()
{
    
    
    cin >> n;
    int temp1;
    for(int i=1; i<=n; i++)
    {
    
    
        cin >> temp1;
        a.insert(temp1);
    }
    int k=1;
    while(a.count(k))       //a.count就是查找k是否存在,如果存在则返回1,否则返回0
    {
    
    
        k++;
    }
    cout << k;
    return 0;
}

A1120

#include<iostream>
#include<set>
using namespace std;

set<int> a;

int n;

int he(int x)
{
    
    
    int ans=0;
    while(x!=0)
    {
    
    
        ans+=x%10;
        x/=10;
    }
    return ans;
}

int main()
{
    
    
    cin >> n;
    int temp1;
    for(int i=0; i<n; i++)
    {
    
    
        cin >> temp1;
        a.insert(he(temp1));
    }
    cout << a.size() << endl;
    for(set<int>::iterator it=a.begin(); it!=a.end(); it++)
    {
    
    
        if(it!=a.begin())
            cout << " ";
        cout << *it;
    }

}

おすすめ

転載: blog.csdn.net/wsfhdhjs/article/details/109853839