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=2∗i−1 ,对前 n 项 求和既是对等差数列求和
等差数列求和公式1:
(
首
项
+
末
项
)
∗
n
2
(首项+末项)*n\over2
2(首项+末项)∗n
等差数列求和公式2:
n
∗
a
1
+
(
n
−
1
)
∗
n
2
n*a_1+{(n-1)*n\over2}
n∗a1+2(n−1)∗n
等比数列求和公式:
a
1
∗
(
1
−
q
n
)
1
−
q
a_1*(1-q^n)\over{1-q}
1−qa1∗(1−qn)
根据求和公式 求出来 前 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] [1−Bi] 中取 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(贪心)
思路:
算出给出的所有正方形所需要的最小正方形框,与给出正方形框数量做对比即可;
- 6*6 每个正方形占一个框
- 5* 5 每个正方形占一个框 余下 11 个 1*1 的正方形框
- 4* 4 每个正方形占一个框 余下 5 个 2* 2 的正方形框
- 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, - 2 *2的正方形优先消耗前面空出来的位置 , 多出来的去填框 ,然后把2 *2消耗剩下的,加到 1 *1 中 ;
- 最后计算 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");
}
}