Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset

A - Five Variables

Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第1张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第2张图片
在这里插入图片描述

题意:

给你五个数,(原本是序列),但其中有一个变成了0,问是哪一个变成了0.

思路:

输入时,记录一下即可。

AC

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int ans=0,x;
    For(i,1,5)
    {
        cin>>x;
        if(x==0)ans=i;
    }
    cout<<ans<<endl;
    return 0;
}

B - Crane and Turtle

Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第3张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第4张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第5张图片

题意:

鸡兔同笼问题,题目给你 总数 和 腿数。
要你找是否存在一组解法。

思路x1:

暴力解方程。

反思

注意一下特判,qwq

ACx1

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int a,b;
    cin>>a>>b;
    if(b&1)cout<<"No"<<endl;
    else
    {
        b/=2;
        if(b-a<=a&&b-a>=0)cout<<"Yes"<<endl;//b-a>=0 spj
        else cout<<"No"<<endl;
    }
    return 0;
}

思路x2:

枚举可能的解。

ACx2

#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int x,y;
    cin>>x>>y;
    For(i,0,x)
    {
        if(i*2+(x-i)*4==y)//a=i;b=x-i;
        {
            cout<<"Yes"<<endl;
            return 0;
        }
    }
    cout<<"No"<<endl;
    return 0;
}

C - Forbidden List

Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第6张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第7张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第8张图片

题意:

给你一个序列,问不在其中与给定x距离最小的元素。

思路:

从x,左右两边开始枚举。

AC:

#include 
#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
map<int,int>vis;
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,x,temp;
    cin>>x>>n;
    For(i,1,n)cin>>temp,vis[temp]=1;
    int ans=0,i=x,j=x;
    while(1)
    {
        if(vis[i])i--;
        else
        {
            ans=i;
            break;
        }
        if(vis[j])j++;
        else
        {
            ans=j;
            break;
        }
    }
    cout<<ans<<endl;
    return 0;
}

D - Not Divisible

Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第9张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第10张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第11张图片

题意:

给你一个序列,问其中有多少个元素不能被其他元素整除。

思路

定义一个筛因子数组(bool类型)。dv【】。

  1. 初始时,数组里的元素为假false,没被筛过。
  2. 排序后,找到最小的元素a【x】,之后用a【x】,筛出所有含有a【x】因子的数,用一个数组dv标记为true。
  3. 后面遍历数组时,如果该数已经被前面的小值筛过,(即该数能被前面的数整除),那么ans不动,假如没被筛过(没有因子)ans++。
  4. 相同元素就设置一个vis,假如vis>1,那么就有相同。

反思

  1. vector< INT > V(sizevalaue )(一种vector的定义)

AC

#include 
#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
typedef long long ll;
const int maxx=1e6+10;
ll a[maxx];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,x;
    cin>>n;
    For(i,1,n)cin>>x,a[x]++;
    vector<bool>dv(maxx,true);
    int ans=0;
    For(i,1,maxx)
    {
        if(!a[i])continue;
        if(a[i]==1&&dv[i])ans++;
        for(int j=2; j*i<maxx; j++)dv[i*j]=false;
    }
    cout<<ans<<endl;
    return 0;
}

E - Smart Infants

Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第12张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第13张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第14张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第15张图片
Atcoder ABC 170 A-E(F好像不难,有空再补吧) A-简单记录,B-鸡兔同笼(二元解方程), C-枚举暴力, D-筛法, E-multiset_第16张图片

题意:

给你一群小孩,每个小孩有rating,每个小孩在一个幼稚园。去除每个幼稚园里最大的rating。在这些ratings中最小的就是答案。

思路:

对于取一个幼稚园中最大,和取幼稚园中最大的最小。可以用multiset去维护,(元素可能相同)

  1. 可以定义一个 multiset < int > house[maxn] 去存放幼稚园里每个小孩的rating。
  2. multiset < int > ans 去存放每个幼稚园最大的rating。

反思

  1. insert 是插值。
  2. find 是找值。(algorithm里有find,我当时好像用了lower_bound,哭)
  3. erase 是删元素,里面要放指针。(可以s.erase(s.find()))
  4. 由于huose【i】里要取最大值,并且set一般是升序。所以要,house【i】.rbegin()

AC(一直re,原来是数组越界,qwq)

#include 
#include 
#include 
#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct point
{
    int num;
    int score;
}p[maxn];
multiset<int>s;
multiset<int>ms[maxn];
ll vis[maxn];
ll use[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,q,cur,a;
    cin>>n>>q;
    multiset<int>::iterator it;
    For(i,1,n)
    {
        cin>>a>>cur;
        vis[i]=cur;
        p[i].num=cur;p[i].score=a;
        use[cur]=1;ms[cur].insert(a);
    }
   For(i,1,maxn-1)if(use[i])s.insert(*ms[i].rbegin());
  // for(it=s.begin();it!=s.end();it++)cout<<(*it).num<<' '<<(*it).score<
   //cout<
    For(i,1,q)
    {
        int c,d;
        cin>>c>>d;
        int pre=vis[c];vis[c]=d;
       // cout<<(*it).num<<' '<<(*it).score<
        if(!s.empty())s.erase(s.find(*ms[pre].rbegin() ));
        ms[pre].erase(ms[pre].find(p[c].score));
        ///
       // for(it=s.begin();it!=s.end();it++)cout<<(*it)<
        //cout<<"ok"<
        if(!ms[pre].empty())
        {
            s.insert(*ms[pre].rbegin() );
        }
        if(!ms[d].empty())
        {
            int temp=*ms[d].rbegin();
            s.erase(s.find(temp));
        }
        ms[d].insert(p[c].score);
        s.insert(*ms[d].rbegin());
       // cout<<"ok"<
        cout<<*s.begin()<<endl;
    }
    return 0;
}

AC(这个是考场的,写的有点乱)

#include 
#include 
#include 
#include 
#define For(i,x,y) for(register int i=(x); i<=(y); i++)
using namespace std;
typedef long long ll;
const int maxn=2e5+10;
struct point
{
    int num;
    int score;
    bool operator< (const point &a)const{
        if(score!=a.score)return score<a.score;
        else return num<a.score;
        }
}p[maxn];
multiset<int>s;
multiset<int>ms[maxn];
int ans[maxn];
ll vis[maxn];
ll use[maxn];
int main()
{
    ios::sync_with_stdio(0);cin.tie(0);cout.tie(0);
    int n,q,cur,a;
    cin>>n>>q;
    multiset<int>::iterator it;
    For(i,1,n)
    {
        cin>>a>>cur;
        vis[i]=cur;
        p[i].num=cur;p[i].score=a;//it=s.find({cur,ans[cur]});
     //   ans[cur]+=a;
        ans[cur]=max(ans[cur],a);use[cur]=1;ms[cur].insert(a);
    }
   For(i,1,maxn-1)if(use[i])s.insert(ans[i]);
   //cout<
  // for(it=s.begin();it!=s.end();it++)cout<<(*it).num<<' '<<(*it).score<
   //cout<
    For(i,1,q)
    {
        int c,d;
        cin>>c>>d;
        int pre=vis[c];vis[c]=d;
        //cout<
        //it=;it--;
       // cout<<(*it).num<<' '<<(*it).score<
        if(!s.empty())s.erase(s.find(ans[pre]));
        ms[pre].erase(ms[pre].find(p[c].score));
        ///
       // for(it=s.begin();it!=s.end();it++)cout<<(*it)<
       // cout<
      ///  ans[pre]=p[c].score;
        //cout<<"ok"<
      //  cout<
        if(!ms[pre].empty())
        {
            s.insert(*ms[pre].rbegin() );
            ans[pre]=*ms[pre].rbegin();
        }
        else ans[pre]=0;
       // cout<
        if(!ms[d].empty())
        {   //it=s.find(ans[d]);it--;
            s.erase(s.find(ans[d]));
        }
       // cout<<"OK"<
        ms[d].insert(p[c].score);ans[d]=*ms[d].rbegin();
        s.insert(ans[d]);
       // cout<<"ok"<
        cout<<*s.begin()<<endl;
    }
    return 0;
}

你可能感兴趣的:(stl,数论)