牛客周赛 Round 65 个人题解
牛客周赛 Round 65
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
void solve(){
int n,a,b;cin>>n>>a>>b;
int ans=0;
for(int i=0;i<=100;i++){
for(int j=0;j<=100;j++){
if(i*a+j*b<=n){
ans=max(ans,i+j);
}
}
}
cout<<ans<<endl;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
while(T--) solve();
return 0;
}
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
char g[1010][1010];
void solve(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
for(int j=1;j<=m;j++){
cin>>g[i][j];
}
}
int ans=0;
for(int i=1;i<=n-1;i++){
for(int j=1;j<=m-1;j++){
if(g[i][j]=='*' && g[i][j+1]=='*' && g[i+1][j]=='*' && g[i+1][j+1]=='*'){
ans++;
}
}
}
cout<<ans<<endl;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
while(T--) solve();
return 0;
}
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1010;
int a[N];
void solve(){
int n;cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
int sum1=0,sum2=0;
swap(a[1],a[n]);
for(int i=n;i>=1;i--){
if(i%2==0){
sum1+=a[i];
}
else{
sum2+=a[i];
}
}
if(sum1>sum2) cout<<"kou"<<endl;
else if(sum1<sum2) cout<<"yukari"<<endl;
else cout<<"draw"<<endl;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T;cin>>T;
while(T--) solve();
return 0;
}
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[30],pw[30];
struct node{
int v,cnt;
}c[N];
void init(){
pw[0]=1;
for(int i=1;i<=30;i++){
pw[i]=pw[i-1]*2;
}
}
void solve(){
int n,m;cin>>n>>m;
for(int i=1;i<=n;i++){
string s;cin>>s;
int len=s.size();
s=" "+s;
int cnt=0;
int num=0;
for(int i=len;i>=1;i--){
num+=(s[i]-'0')*pw[cnt];
cnt++;
}
a[i]=num;
}
// for(int i=1;i<=n;i++) cout<<a[i]<<endl;
int k;cin>>k;
for(int i=1;i<=k;i++){
string s;cin>>s;
int len=s.size();
s=" "+s;
int cnt=0;
int num=0;
for(int i=len;i>=1;i--){
num+=(s[i]-'0')*pw[cnt];
cnt++;
}
b[i]=num;
}
int tot=0;
int maxn=pw[k]-1;
// for(int i=1;i<=k;i++) cout<<b[i]<<" ";
// cout<<endl;
for(int i=0;i<=maxn;i++){
int num=0;
int cnt=0;
for(int j=0;j<=k-1;j++){
if((i>>j)&1ll){
num|=b[j+1];
cnt++;
}
}
c[++tot]={num,cnt};
}
// for(int i=1;i<=tot;i++) cout<<c[i].v<<endl;
// cout<<endl;
for(int i=1;i<=n;i++){
int ans=1e9;
for(int j=1;j<=tot;j++){
if((a[i]&c[j].v)==a[i]){
ans=min(ans,c[j].cnt);
}
}
if(ans==1e9) cout<<-1<<endl;
else cout<<ans<<endl;
}
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
init();
int T=1;
while(T--) solve();
return 0;
}
解题思路
- 考虑贪心,要求最大值时,每一个问号都应该尽可能降低温度,所以a[i]=a[i-1]-x,但是如果超过了最小值,那么a[i]已无法提供一次贡献,那么则将a[i]设置为最大值maxn,让他为后面做贡献
- 要求最小值时只需令a[i]=a[i-1]-x+1即可
- E,F同理,仅有数据范围的差别
#include<bits/stdc++.h>
#define endl '\n'
using namespace std;
int a[110],b[110];
void solve(){
int n,x;cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
int maxn=50,minn=-50,vis=-999;
int ans1=0,ans2=0;
for(int i=1;i<=n;i++){
if(i==1){
if(a[i]==vis) a[i]=maxn;
continue;
}
if(a[i]!=vis){
if(a[i-1]-a[i]>=x) ans1++;
}
else{
if(a[i-1]-x>=minn){
a[i]=a[i-1]-x;
ans1++;
}
else a[i]=maxn;
}
}
for(int i=1;i<=n;i++){
if(i==1){
if(b[i]==vis) b[i]=minn;
continue;
}
if(b[i]!=vis){
if(b[i-1]-b[i]>=x) ans2++;
}
else b[i]=max(minn,b[i-1]-x+1);
}
cout<<ans1<<" "<<ans2<<endl;
}
int main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
while(T--) solve();
return 0;
}
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int a[N],b[N];
void solve(){
int n,x;cin>>n>>x;
for(int i=1;i<=n;i++){
cin>>a[i];
b[i]=a[i];
}
int maxn=5e8,minn=-5e8;
int vis=-1*(int)999999999;
int ans1=0,ans2=0;
for(int i=1;i<=n;i++){
if(i==1){
if(a[i]==vis) a[i]=maxn;
continue;
}
if(a[i]!=vis){
if(a[i-1]-a[i]>=x) ans1++;
}
else{
if(a[i-1]-x>=minn){
a[i]=a[i-1]-x;
ans1++;
}
else a[i]=maxn;
}
}
for(int i=1;i<=n;i++){
if(i==1){
if(b[i]==vis) b[i]=minn;
continue;
}
if(b[i]!=vis){
if(b[i-1]-b[i]>=x) ans2++;
}
else b[i]=max(minn,b[i-1]-x+1);
}
cout<<ans1<<" "<<ans2<<endl;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
while(T--) solve();
return 0;
}
解题思路
- 构造题,相邻位置只能相差1,那我们不妨假设一开始构造101010101即奇数位放一,或者0101010101即偶数位放一
- 当第一层搭好后,我们不难发现,接下来相当于要每次添加一个1x2的砖块,并且一定是1x2的,如果打好第一层后的砖块数量不能满足为偶数的话,即输出-1
- 那么我们可以先循环的放n轮全放的(这意味着n轮结束后顶部情况会和第一层情况保持一致),然后我们只需对剩下的砖块进行摆放即可。
- 为了方便判断,此处给出两种地基的实现方式都进行计算,如有一种满足即可。
#include<bits/stdc++.h>
#define endl '\n'
#define int long long
using namespace std;
const int N=1e5+10;
int n,m;
int a[N];
bool flag=0;
//初始1 3 5 7奇数位放一
void work1(){
vector<int> a(n+1,0);
int res=m;
for(int i=1;i<=n;i+=2){
a[i]++,res--;
}
if(res<0 || res%2==1) return;
res/=2;
int round=res/n;
res%=n;
for(int i=2;i<=n;i+=2){
if(res<=0) break;
a[i]+=2,res--;
}
for(int i=1;i<=n;i+=2){
if(res<=0) break;
a[i]+=2,res--;
}
flag=1;
for(int i=1;i<=n;i++) a[i]+=round*2;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
//初始2 4 6 8偶数位放一
void work2(){
vector<int> a(n+1,0);
int res=m;
for(int i=2;i<=n;i+=2){
a[i]++,res--;
}
if(res<0 || res%2==1) return;
res/=2;
int round=res/n;
res%=n;
for(int i=1;i<=n;i+=2){
if(res<=0) break;
a[i]+=2,res--;
}
for(int i=2;i<=n;i+=2){
if(res<=0) break;
a[i]+=2,res--;
}
flag=1;
for(int i=1;i<=n;i++) a[i]+=round*2;
for(int i=1;i<=n;i++) cout<<a[i]<<" ";
cout<<endl;
}
void solve(){
cin>>n>>m;
work1();
if(!flag) work2();
if(!flag) cout<<-1<<endl;
}
signed main(){
std::ios::sync_with_stdio(false);
cin.tie(0);cout.tie(0);
int T=1;
while(T--) solve();
return 0;
}