Atcoder ABC 170 A-E(F好像不難,有空再補吧) A-簡單記錄,B-雞兔同籠(二元解方程), C-枚舉暴力, D-篩法, E-multiset

A - Five Variables

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你五個數,(原本是序列),但其中有一個變成了0,問是哪一個變成了0.

思路:

輸入時,記錄一下即可。

AC

#include <iostream>
#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

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

雞兔同籠問題,題目給你 總數 和 腿數。
要你找是否存在一組解法。

思路x1:

暴力解方程。

反思

注意一下特判,qwq

ACx1

#include <iostream>
#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 <iostream>
#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

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你一個序列,問不在其中與給定x距離最小的元素。

思路:

從x,左右兩邊開始枚舉。

AC:

#include <iostream>
#include <map>
#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

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你一個序列,問其中有多少個元素不能被其他元素整除。

思路

定義一個篩因子數組(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 <iostream>
#include <vector>
#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

在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述
在這裏插入圖片描述

題意:

給你一羣小孩,每個小孩有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 <iostream>
#include <vector>
#include <set>
#include <algorithm>
#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<<endl;
   //cout<<endl;
    For(i,1,q)
    {
        int c,d;
        cin>>c>>d;
        int pre=vis[c];vis[c]=d;
       // cout<<(*it).num<<' '<<(*it).score<<endl;
        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)<<endl;
        //cout<<"ok"<<endl;
        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"<<endl;
        cout<<*s.begin()<<endl;
    }
    return 0;
}

AC(這個是考場的,寫的有點亂)

#include <iostream>
#include <vector>
#include <set>
#include <algorithm>
#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<<endl;
  // for(it=s.begin();it!=s.end();it++)cout<<(*it).num<<' '<<(*it).score<<endl;
   //cout<<endl;
    For(i,1,q)
    {
        int c,d;
        cin>>c>>d;
        int pre=vis[c];vis[c]=d;
        //cout<<pre<<' '<<ans[pre]<<endl;
        //it=;it--;
       // cout<<(*it).num<<' '<<(*it).score<<endl;
        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)<<endl;
       // cout<<endl;
      ///  ans[pre]=p[c].score;
        //cout<<"ok"<<endl;
      //  cout<<pre<<' '<<ans[pre]<<endl;
        if(!ms[pre].empty())
        {
            s.insert(*ms[pre].rbegin() );
            ans[pre]=*ms[pre].rbegin();
        }
        else ans[pre]=0;
       // cout<<d<<' '<<ans[d]<<endl;
        if(!ms[d].empty())
        {   //it=s.find(ans[d]);it--;
            s.erase(s.find(ans[d]));
        }
       // cout<<"OK"<<endl;
        ms[d].insert(p[c].score);ans[d]=*ms[d].rbegin();
        s.insert(ans[d]);
       // cout<<"ok"<<endl;
        cout<<*s.begin()<<endl;
    }
    return 0;
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章