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【】。
- 初始時,數組裏的元素爲假false,沒被篩過。
- 排序後,找到最小的元素a【x】,之後用a【x】,篩出所有含有a【x】因子的數,用一個數組dv標記爲true。
- 後面遍歷數組時,如果該數已經被前面的小值篩過,(即該數能被前面的數整除),那麼ans不動,假如沒被篩過(沒有因子)ans++。
- 相同元素就設置一個vis,假如vis>1,那麼就有相同。
反思:
- vector< INT > V(
size
,valaue
)(一種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
去維護,(元素可能相同)
- 可以定義一個 multiset < int > house[maxn] 去存放幼稚園裏每個小孩的rating。
- multiset < int > ans 去存放每個幼稚園最大的rating。
反思:
- insert 是插值。
- find 是找值。(algorithm裏有find,我當時好像用了lower_bound,哭)
- erase 是刪元素,裏面要
放指針
。(可以s.erase(s.find())) - 由於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;
}