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