A Robot Takahashi
思路:将小崽子和大人分到两个数组中排序,然后枚举每个体重大小,用lower_bound();求得正确数量不断用max();求出答案
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 200005;
vector<int> a, c;
int w[N]; char s[N];
int f(int x)
{
int ax = a.end() - lower_bound(a.begin(), a.end(), x);
int cx = lower_bound(c.begin(), c.end(), x) - c.begin();
return ax + cx;
}
int main()
{
ios::sync_with_stdio(false);cin.tie(0);cout.tie(0);
int n;
cin >> n >> s;
for(int i=0; i<n; i++)
{
cin >> w[i];
if(s[i] == '0') c.push_back(w[i]);
else a.push_back(w[i]);
}
sort(a.begin(), a.end());
sort(c.begin(), c.end());
int ans = 0;
for(int i=0; i<n; i++)
{
int c = w[i];
ans = max(ans,f(c));
ans = max(ans,f(c+1));
}
cout << ans;
return 0;
}
B Connect 6
题意:给出的图中是否有一个‘#’ 在 行 || 列 || 主对角线 || 辅对角线 至多再加两个‘#’ 使之有6个连续的‘#’ (简称下六子棋)
思路:直接暴力搜索就好
AC代码:
#include<bits/stdc++.h>
using namespace std;
const int N = 1003;
string s[N];
int n;
int main(){
cin>>n;
int ans = 0;
for(int i=0;i<n;i++) cin>>s[i];
for(int i=0;i<n;i++){
for(int j=0;j<n;j++){
if(i+5<n){
int cnt = 0;
for(int k=i;k<=i+5;k++) cnt += s[k][j]=='.';
ans |= cnt<=2;
}
if(j+5<n){
int cnt = 0;
for(int k=j;k<=j+5;k++) cnt += s[i][k]=='.';
ans |= cnt<=2;
}
if(i+5<n && j+5<n){
int cnt = 0;
for(int k=0;k<6;k++) cnt += s[i+k][j+k]=='.';
ans |= cnt<=2;
}
if(i-5>=0 && j+5<n){
int cnt = 0;
for(int k=0;k<6;k++) cnt += s[i-k][j+k]=='.';
ans |= cnt<=2;
}
}
}
if(ans) cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return 0;
}
C Strange Balls
题意:按顺序往洞里扔球,每个球有个数字i,有i个印着i球的球连一起的时候会消失,问最后剩几个球
思路:洞->栈,但每次要有球消失的时候进栈出栈会超时,所以改来维护栈顶相同球的数量,数量到了就pop();
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
stack<pair<int,int> > S;
int n,cnt=0;
int arr[200005];
signed main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>arr[i];
}
for(int i=1;i<=n;i++){
if(S.empty()){
S.push( {arr[i],1} );
cnt++;
}
else if(S.top().first == arr[i]){
S.top().second++;
cnt++;
if(S.top().second == arr[i]){
cnt -= arr[i];
S.pop();
}
}
else{
S.push({arr[i],1});
cnt++;
}
cout<<cnt<<endl;
}
return 0;
}
D Linear Probing
题意:一个1到2^20的数组,每个数都是-1,两种操作,[1]输入一个数x,从第x位开始往后数到第一个是-1的位置,将这个数换成x,[2]输出第x位的数
思路:直接弄一定会超时/超栈,所以采用并查集,当一个数被改过之后,其父点改为后一个为-1的点的位置
AC代码:
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int mod = 1048576;
int arr[mod],ne[mod];
int find(int x){
return ne[x]!=x?ne[x]=find(ne[x]):x;
}
signed main(){
for(int i=0;i<mod;i++) ne[i]=i,arr[i]=-1;
int q;
cin>>q;
while(q--){
int op,x,id;
cin>>op>>x;
id = x%mod;
if(op==1){
id = find(id);
arr[id] = x;
ne[id]=find((id+1)%mod);
}
else{
cout<<arr[id]<<endl;
}
}
return 0;
}