牛客小白月赛90
A.小A的文化节
思路
没思路,签到题,一个可以优化内存的点是项目可以不开数组,只用一个变量就行
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int n,m;
int a[N];
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
int ans=0;
int ele;
for(int i=1;i<=m;i++){
cin>>ele;
ans+=a[ele];
}
cout<<ans<<endl;
return ;
}
int main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
B.小A的游戏
思路
假设 \(a,b,c\) 分别是A胜,打平和B胜的场次,则A的得分:\(3a+b\) ; B的得分:\(3c+b\) ,两式相减得 : \(3(a-c)\) ,这个式子一定要是3的倍数才行,一个判断就行;
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
int a,b;
void solve(){
cin>>a>>b;
if((a-b)%3==0)cout<<"Yes"<<endl;
else cout<<"No"<<endl;
return ;
}
int main()
{
fast();
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
C.小A的数字
思路
构造:每次使用尽量小的数字就行,我优先使用0和1构造,能选0选0,不能就选1,再最后删去所有前导零,这种思路需要一个特判:当答案全是0的时候,证明原数字不包含0,此时看最后一位,是1输出2,不是1输出1即可
代码
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
string s;
void solve(){
cin>>s;
int n=s.size();
string ans="";
for(int i=n-1;i>=0;i--){
if(s[i]=='0')ans="1"+ans;
else ans="0"+ans;
}
int start=0;
for(int i=0;i<n;i++){
if(ans[i]=='0')start++;
else break;
}
ans=ans.substr(start,n-start);
if(ans==""){
if(s[n-1]=='1')cout<<2<<endl;
else cout<<1<<endl;
return ;
}
else cout<<ans<<endl;
}
int main()
{
fast();
int t=1;
cin>>t;
while(t--){
solve();
}
return 0;
}
D.小A的线段(easy version)
思路
m的数据上界只有10,DFS爆搜即可,枚举每个线段用和不用(连状态数组都不用开)
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e6+10, MAX = 1e9, INF = -1e9;
ll mod = 998244353 ;
int n,m;
vector<PII> v(15);
ll ans=0;
vector<int> a(N,0);
void dfs(int x){
if(x>m){
bool flag=true;
for(int i=1;i<=n;i++){
if(a[i]<2)flag=false;
//break;
}
if(flag)ans++;
return ;
}
//选
int left=v[x].first;int right=v[x].second;
for(int i=left;i<=right;i++)a[i]++;
dfs(x+1);
//不选
for(int i=left;i<=right;i++)a[i]--;
dfs(x+1);
}
void solve(){
cin>>n>>m;
int l,r;
for(int i=1;i<=m;i++){
cin>>l>>r;
v[i]={l,r};
}
dfs(1);
cout<<ans<<endl;
return ;
}
int main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}
E.小A的任务
思路
m的上界是100,比较小,每次询问枚举最后一个B问题,用优先队列维护最小值即可(直接暴力好像就行,唉)
AC代码
#include<bits/stdc++.h>
#define endl '\n'
#define ll long long
#define pb push_back
#define fast() ios::sync_with_stdio(false),cin.tie(nullptr),cout.tie(nullptr)
using namespace std;
typedef pair<char,int> PCI;
typedef pair<int,int> PII;
const int N = 2e5+10, MAX = 1e9, INF = -1e9;
ll a[N],b[N],c[N],k,n,m;
priority_queue<ll>p;
void solve(){
cin>>n>>m;
for(int i=1;i<=n;i++)
cin>>a[i],a[i]+=a[i-1];
for(int i=1;i<=n;i++)
cin>>b[i],c[i]=b[i],b[i]+=b[i-1];
while(m--){
cin>>k;
ll f=upper_bound(a+1,a+1+n,a[k]+b[k])-a-1;
ll ans=a[k]+b[k],t=0;
while(!p.empty())p.pop();
for(int i=1;i<=k;i++)p.push(c[i]);
for(int i=k+1;i<=f;i++){
int x=p.top()-c[i];
if(x>0)p.pop(),p.push(c[i]),t+=x;
ans=min(ans,a[i]+b[k]-t);
}
cout<<ans<<endl;
}
return ;
}
int main()
{
fast();
int t=1;
//cin>>t;
while(t--){
solve();
}
return 0;
}