2024牛客寒假算法基础集训营1
A.
因为判断要素较少,直接条件模拟
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n;cin>>n;
string s;cin>>s;
int D=0,F=0,S=0,d=0,f=0,ss=0;
for(int i=0;i<s.size();i++){
if(s[i]=='D')D=1;
else if(s[i]=='F'&&D==1)F=1;
else if(s[i]=='S'&&F==1)S=1;
if(s[i]=='d')d=1;
else if(s[i]=='f'&&d==1)f=1;
else if(s[i]=='s'&&f==1)ss=1;
}
if(D&&F&&S)cout<<1<<' ';
else cout<<0<<' ';
if(d&&f&&ss)cout<<1<<'\n';
else cout<<0<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
C.
贪心+二分
贪心是把处理时长升序排序
二分的是鸡处理事情的时间点
当鸡在t时处理事情时,在t时还没有办完事情的人的不满意度都要加上tc
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n,q,tc;cin>>n>>q>>tc;
vector<int>t(n+1);
for(int i=1;i<=n;i++)cin>>t[i];
sort(t.begin()+1,t.end());
vector<int>pre(n+1,0);
for(int i=1;i<=n;i++)pre[i]=pre[i-1]+t[i];
for(int i=1;i<=n;i++)t[i]+=pre[i-1];
vector<int>pr(n+1,0);
for(int i=1;i<=n;i++)pr[i]=pr[i-1]+t[i];
// cout<<"t[n]="<<t[n]<<'\n';
while(q--){
int mi=1e15;
int m;cin>>m;
int l=0,r=1e15,mid;
while(l<=r){
mid=(l+r)/2;
if(mid>=t[n]){
mi=min(mi,mid);
// cout<<"mi="<<mi<<'\n';
r=mid-1;
continue;
}
int id= upper_bound(t.begin()+1,t.end(),mid)-t.begin();
int tmp=tc*(n-id+1);
if(tmp<=m){
mi=min(mi,mid);
r=mid-1;
}else l=mid+1;
}
mi+=tc;
cout<<mi<<'\n';
}
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
//cin>>left;
while(left--){
solve();
}
}
E.
数据范围很小,3的10次方爆搜
每一轮每种结果去枚举,取最优
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
int n,m;
int a[15],u[15],v[15];
int ans;
void dfs(int dep){
if(dep==m+1){
vector<int>res(n+1);
for(int i=1;i<=n;i++){
res[i]=a[i];
// cout<<a[i]<<' ';
}
//cout<<'\n';
sort(res.begin()+1,res.end());
for(int i=n;i>=1;i--){
if(res[i]==a[1]){
ans=min(ans,n-i+1);
return ;
}
}
}
for(int i=1;i<=3;i++){
if(i==1){
a[u[dep]]+=3;
dfs(dep+1);
a[u[dep]]-=3;
}else if(i==2){
a[v[dep]]+=3;
dfs(dep+1);
a[v[dep]]-=3;
}else if(i==3){
a[u[dep]]+=1;a[v[dep]]+=1;
dfs(dep+1);
a[u[dep]]-=1;a[v[dep]]-=1;
}
}
}
void solve() {
//dfs2(1,1);
cin>>n>>m;
for(int i=1;i<=n;i++)cin>>a[i];
for(int i=1;i<=m;i++)cin>>u[i]>>v[i];
ans=15;
dfs(1);
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
G.
贪心
按原价升序排序,然后把优惠价求前缀和
只要优惠后+本钱能买得起当前原价,结果就为优惠和+本钱
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n,m;cin>>n>>m;
vector<pair<int,int>>v(n+1);
for(int i=1;i<=n;i++){
cin>>v[i].first>>v[i].second;
}
sort(v.begin()+1,v.end());
vector<int>pre(n+1,0);
for(int i=1;i<=n;i++){
pre[i]=pre[i-1]+v[i].second;
}
int ans=m;
for(int i=1;i<=n;i++){
if(v[i].first-pre[i]<=m)
ans=max(ans,v[i].first+pre[i]-v[i].first+m);
}
cout<<ans<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}
M.
若n能被6整除,那么就是n/6个页面
若不能被整除,就有错位,那么就是n/6*2
#include <bits/stdc++.h>
using namespace std;
#define int long long
const int N=2e5+10;
void solve() {
int n;cin>>n;
if(n%6==0)cout<<n/6<<'\n';
else cout<<2*(n/6)<<'\n';
}
signed main(){
ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int left=1;
cin>>left;
while(left--){
solve();
}
}