牛客小白月赛53(A-E)

牛客小白月赛53 入口

A:Raining

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

int a[5],x;

int main()
{
	for(int i=1;i<=4;i++) cin>>a[i];
	cin>>x;
	for(int i=1;i<=4;i++) cout<<max(0,x-a[i])<<" ";
}
反思:

对于每个情况不用再使用 if 语句 判断 x 与 a[ i ] 的大小 ,直接用 max 函数 更加方便快捷 ,记住这种用法;

B:Kissing

思路

化简第 i 项公式 我们会发现 S i = 2 ∗ i − 1 S_i=2*i-1 Si=2i1 ,对前 n 项 求和既是对等差数列求和
等差数列求和公式1: ( 首 项 + 末 项 ) ∗ n 2 (首项+末项)*n\over2 2(+)n
等差数列求和公式2: n ∗ a 1 + ( n − 1 ) ∗ n 2 n*a_1+{(n-1)*n\over2} na1+2(n1)n
等比数列求和公式: a 1 ∗ ( 1 − q n ) 1 − q a_1*(1-q^n)\over{1-q} 1qa1(1qn)

根据求和公式 求出来 前 n 项 和 为 n 2 n^2 n2 注意 n 的范围 要 开 ll 并且提前取模

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;

ll n;
ll ans;
const int p = 998244353;
int main()
{
	cin>>n;
	ans=((n%p)*(n%p))%p;
	cout<<ans;
}

C:Missing

思路:

当给出串与目标串长度不同时 k = 0 k=0 k=0 但是 相同时 k = s u m ÷ ∣ b ∣ k = sum \div |b| k=sum÷b 相同时 ∣ b ∣ 都 相 同 |b| 都相同 b 故相同时 k = s u m k=sum k=sum

#include<bits/stdc++.h>
using namespace std;
typedef unsigned long long ll;

struct node{
	string s1;
	int k;
}a[101];

vector<string>ve;
string s,ss;
int n,max1;

int main()
{
	cin>>s;
	cin>>n;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i].s1;
		if(a[i].s1.size()!=s.size()) a[i].k=0;
		else
		{
			int cnt=0;
			for(int j=0;j<s.size();j++)
			{
				if(s[j]==a[i].s1[j]) cnt++;
			}
			a[i].k=cnt;
            max1=max(max1,a[i].k);
		}
	}
	
	
		for(int i=1;i<=n;i++)
		{
            if(a[i].k==max1)
			ve.push_back(a[i].s1);
		}
		
		sort(ve.begin(),ve.end());
		
		for(auto k : ve)
		{
			cout<<k<<endl;
		}
	
}
反思:

一开始没用 vector 排序 去找字典序 ,一开始 用 的 set 存储 ,没注意到 set 会把 相同的 字符串吞掉 ,以后要多加注意 set 的 性质

D:Breezing

思路:

根据题意我们容易看出一个事实,每一个位置的 A i A_i Ai [ 1 − B i ] [1-B_i] [1Bi] 中取 1 或者 B i B_i Bi 才能使可爱值值最大,所以要用动态规划的思想来做;

//dp[i][0] t[i] 选 1
//dp[i][1] t[i] 选 最大 
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1e5+10;
ll dp[N][3];
int m;
int t[N];
//dp[i][0] t[i] 选 1
//dp[i][1] t[i] 选 最大 

int main()
{
	cin>>m;
	for(int i=1;i<=m;i++) cin>>t[i];
	for(int i=2;i<=m;i++)
	{
		dp[i][0]=max(dp[i-1][0],dp[i-1][1]+(t[i-1]-1));
		dp[i][1]=max(dp[i-1][0]+(t[i]-1),dp[i-1][1]+abs(t[i]-t[i-1]));
	}
	cout<<max(dp[m][0],dp[m][1]);	
	return 0;
}

E:Calling(贪心)

思路:

算出给出的所有正方形所需要的最小正方形框,与给出正方形框数量做对比即可;

  1. 6*6 每个正方形占一个框
  2. 5* 5 每个正方形占一个框 余下 11 个 1*1 的正方形框
  3. 4* 4 每个正方形占一个框 余下 5 个 2* 2 的正方形框
  4. 3* 3 的情况比较复杂 , 每个框可以放下 4 个 3* 3 的正方形 ,但是不一定恰好都放满,所以我们要讨论有剩余空位的情况,
    4.1 当多出一个 3 * 3 空位时 ,我们可以放 1 个 2*2 正方形 和 5 个 1 *1 正方 形框
    4.2 当多出两个 3 *3 空位时 , 我们可以放 3 个 2 * 2 正方形 和 6 个 1 *1正方形
    4.3 当多出三个 3 *3空位时 , 我们可以放 5 个 2 * 2 正方形 和 7 个 1 * 1 正方形
    我们要计算最少消耗框的个数,由于 2 *2 的正方形 也可以放 1 *1的正方形 ,所以我们优先放 2 *2,
  5. 2 *2的正方形优先消耗前面空出来的位置 , 多出来的去填框 ,然后把2 *2消耗剩下的,加到 1 *1 中 ;
  6. 最后计算 1*1 消耗框个数
#include<bits/stdc++.h>
using namespace std;

typedef long long ll;
const int N = 1e5+10;

ll t,kk,k;
ll a[7];
ll cnt2,cnt1,sum;

//  cnt1 1 的空位
//  cnt2 2 的空位
// kk 最少消耗的个数,已有的个数 

int main()
{
	cin>>t;
	while(t--)
	{
		cin>>k;
		cnt1=cnt2=0;kk=0;
		for(int i=1;i<=6;i++) cin>>a[i];
		
		kk+=a[6];// 6
		
		kk+=a[5];
		cnt1+=a[5]*11;// 5
		
		kk+=a[4];
		cnt2+=a[4]*5;// 4
		
		if(a[3]%4==0) kk+=a[3]/4;
		else
		{
			kk+=a[3]/4+1;
			ll cnts=4-a[3]%4;//剩
			
			if(cnts==1)
			{
				cnt2+=1;
				cnt1+=5;
			}
			if(cnts==2)
			{
				cnt2+=3;
				cnt1+=6;
			}
			if(cnts==3)
			{
				cnt2+=5;
				cnt1+=7;
			}
		}
		
		if(cnt2<a[2])
		{
			a[2]-=cnt2;
			if(a[2]%9==0) kk+=a[2]/9;
			else
			{
				kk+=a[2]/9+1;
				ll cnts=9-a[2]%9;
				cnt1+=cnts*4;
			}
		}
		else
		{
			cnt2-=a[2];
			cnt1+=cnt2*4;
		}// 2
		
		if(cnt1<a[1])
		{
			a[1]-=cnt1;
			if(a[1]%36==0) kk+=a[1]/36;
			else
			{
				kk+=a[1]/36+1;
			}
		}// 1
			
		
		if(k>=kk) puts("Yes");
		else
		puts("No"); 
		
	}
}
  • 2
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

每天都想发疯

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值