8.30 下午训练
| T1 A | T2 B | T3 C | T4 D |
|---|---|---|---|
| 100 | 0 | 100 | 40 |
T1 A
两分钟就可以
注:一开始题目看错,所以
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn();
double a,b;
int main(){
cin>>b>>a;
while(b>=a){
b-=a;
}
printf("%.2lf",b);
return 0;
}
T2 B
通过推出第四种情况我们可以发现
注意到不取模见祖宗
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int mod(99824353);
const int maxn(1e6+10);
int dp1[maxn],dp[maxn];
int T,n;
int main(){
cin>>T;
dp[1]=1;
dp[2]=2;
dp[3]=4;
for(int i(4);i<=1e6;i++){
dp[i]=dp[i-1]+dp[i-2]+dp[i-3];
dp[i]%=mod; //取mod
}
dp1[1]=1;
dp1[2]=3;
dp1[3]=8;
for(int i(4);i<=1e6;i++){
dp1[i]=dp1[i-1]+dp1[i-3]+dp1[i-2]+dp[i];
dp1[i]%=mod; //取mod
}
while(T--){
cin>>n;
cout<<dp1[n]<<'\n';
}
return 0;
}
T3 C
第一眼看到无法到达输出
注意到每条路的长度大得丧心病狂,如果直接枚举速度显然会
对于二分我们只需要二分其的速度并每次判断此速度是否合法,如果合法试试更小的,不合法试更大的。
注:不开 long\text{ }long 见祖宗,只有 50 分
#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int maxn(1e5+10);
ll n,m;
ll a[maxn],x[maxn];
bool ch(ll mid){
ll sum(0);
for(ll i(1);i<=n;i++){
sum+=a[i]/mid;
if(a[i]%mid>0){
sum++;
}
}
if(sum<=m){
return true;
}
return false;
}
int main(){
cin>>n>>m;
ll sum(0),maxx(0);
for(ll i(1);i<=n;i++){
cin>>a[i]>>x[i];
sum+=x[i];
maxx=max(maxx,a[i]);
}
if(sum>=m){
cout<<-1<<'\n';
return 0;
}
m-=sum;
ll l(0),r(maxx);
while(l<r){
ll mid((l+r)/2);
if(ch(mid)){
r=mid;
}else{
l=mid+1;
}
}
cout<<l<<'\n';
return 0;
}
T4 D
注意到题目求曼哈顿距离的最大值的最小值 ,容易看错题
我们设
实际上表示为下面这个形式就可以了,我们发现
规律点是
其中
然后求解出来另外一个点四个方向之中的最大值,最后合并即可
#include<bits/stdc++.h>
using namespace std;
const int maxn(1e6+7);
int a[maxn],b[maxn];
int x[maxn],y[maxn];
int T,n,m;
int d[4][2]={{1,1},{-1,1},{1, -1},{-1, -1}};
int maxx[4];
int main(){
cin>>T;
while(T--){
cin>>n>>m;
for(int i(1);i<=n;i++){
cin>>x[i]>>y[i];
}
for(int i(1);i<=m;i++){
cin>>a[i]>>b[i];
}
for(int i(0);i<4;i++){
maxx[i]=-2e9;
}
for(int i(1);i<=n;i++){
for(int j(0);j<4;j++){
int ans=x[i]*d[j][0]+y[i]*d[j][1];
maxx[j]=max(maxx[j],ans);
}
}
int res(2e9);
for(int i(1);i<=m;i++){
int ans(0);
for(int j(0);j<4;j++){
int temp(maxx[j]-a[i]*d[j][0]-b[i]*d[j][1]);
ans=max(ans,temp);
}
res=min(res,ans);
}
cout<<res<<'\n';
}
return 0;
}