牛客周赛 Round 99 EF
目录
E-小宇_牛客周赛 Round 99
F-汉堡猪猪分糖果_牛客周赛 Round 99
思路:我们先预处理找出一定需要改变的x有多少个(即出现次数大于等于2的x,或者a[i]<i),然后从后往前遍历,如果当前这个数不能小于前一个数且不在预处理的x中,则将其加入到x中,最后输出x的种类就行了。
Code:
void solve()
{int n;cin>>n;map<int,int> mp;set<int> s;vector<int> v(n+1);for(int i=1;i<=n;i++){cin>>v[i];mp[v[i]]++;if(v[i]<i) s.insert(v[i]);if(mp[v[i]]>=2) s.insert(v[i]); }int mn=1e18;for(int i=n;i>=1;i--){if(s.find(v[i])!=s.end())mn=i;else{if(v[i]<mn)mn=v[i];else{mn=i;s.insert(v[i]);}}}cout<<s.size()<<endl;
}
F-汉堡猪猪分糖果_牛客周赛 Round 99
思路:要使每个小朋友的按位与最大,我们可以从高位向低位贪心,如果(1<<i)*m<=n则说明第i个二进制位在m个小朋友上都为1,反之,第i个二进制位在m个小朋友上并不都为1,我们需要计算出最多有多少个1在第i位上,如果((1<<i)-1)*m<n,那么多出的糖果n-((1<<i)-1)*m(向上取整)就要位于第i位。
Code:
void solve()
{int n,m;cin>>n>>m;int ans=0;for(int i=30;i>=0;i--){int x=(1ll<<i);if(m*x<=n){n-=m*x;ans|=x;}else{int t=x-1;if(t*m<n){int k=(n-t*m-1)/x+1;n-=k*x;}}}cout<<ans<<endl;
}