- 吴易繁 的博客
8(八)月(暑期)集训DAY02
- @ 2024-8-6 18:35:16
A. 超速罚单
题目类型:模拟
思路
对于这道题目我们可以记录每个区间的速度,同时更新超了多少的速度的最大值。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e2+10;
int a[N],b[N],c[N],d[N];
int main(){
freopen("speeding.in","r",stdin);
freopen("speeding.out","w",stdout);
int n,m,cnt=1,ans=0;
cin>>n>>m;
while(n--){
int c,d;
cin>>c>>d;
for(int i=cnt;i<cnt+c;i++) a[i]=d;
cnt+=c;
}
cnt=1;
while(m--){
int c,d;
cin>>c>>d;
for(int i=cnt;i<cnt+c;i++) b[i]=d;
cnt+=c;
}
for(int i=1;i<=100;i++) if(b[i]>a[i]) ans=max(ans,b[i]-a[i]);
cout<<ans;
return 0;
}
本题代码已AC,下一次继续保持。
B. 自助饮料
题目类型:模拟
思路
就是一道模拟题,每次遍历时如果有空位,就填补下去,一直遍历下去就行。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e4+10,M=1e2+10;
int a[N],b[M],n,m;
int check(){
for(int i=1;i<=m;i++) if(b[i]>=1) return 1;
return 0;
}
int main(){
freopen("drink.in","r",stdin);
freopen("drink.out","w",stdout);
int cnt=0;
cin>>n>>m;
int idx=m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=m;i++) b[i]=a[i];
while(check()){
for(int i=1;i<=m;i++){
b[i]--;
if(b[i]==0&&idx<n){
idx++;
b[i]=a[idx];
}
}
cnt++;
}
cout<<cnt;
return 0;
}
这道题目只拿了90分,因为代码超时了,下次要注意时间复杂度。
C. PvZ 竞赛版
题目类型:枚举
思路
因为按照题目提示的公式来写就行了,所以我们可以枚举每一种情况,这样就AC了。(实际上这题是导弹拦截原题)
代码
#include<bits/stdc++.h>
using namespace std;
const int N=1e5+10;
pair<int,int> a[N];
int xx1,xy1;
bool cmp(pair<int,int> a,pair<int,int> b){
int c_1=abs(xx1-a.first)*abs(xx1-a.first);
int c_2=abs(xy1-a.second)*abs(xy1-a.second);
int c=c_1+c_2;
int d_1=abs(xx1-b.first)*abs(xx1-b.first);
int d_2=abs(xy1-b.second)*abs(xy1-b.second);
int d=d_1+d_2;
return c>d;
}
int main(){
freopen("pvz.in","r",stdin);
freopen("pvz.out","w",stdout);
int n,xx2,xy2;
cin>>xx1>>xy1>>xx2>>xy2>>n;
for(int i=1;i<=n;i++) cin>>a[i].first>>a[i].second;
sort(a+1,a+1+n,cmp);
int ans=1e9,sum=0;
for(int i=1;i<=n;i++){
int c_1=abs(xx2-a[i].first)*abs(xx2-a[i].first);
int c_2=abs(xy2-a[i].second)*abs(xy2-a[i].second);
int c=c_1+c_2;
int d_1=abs(xx1-a[i].first)*abs(xx1-a[i].first);
int d_2=abs(xy1-a[i].second)*abs(xy1-a[i].second);
int d=d_1+d_2;
ans=min(ans,d+sum);
sum=max(sum,c);
}
cout<<ans;
return 0;
}
我在考试的时候写了这题的代码,但是样例没过,所以就放弃了,下一次不能轻易放弃。
D. 三国游戏
题目类型:排序
思路
对于这道题目我们可以发现,其实我们是必赢的,最大值不行,那我们就找次大值中的最大值。
代码
#include<bits/stdc++.h>
using namespace std;
const int N=5e2+10;
int a[N][N];
int main(){
freopen("sg.in","r",stdin);
freopen("sg.out","w",stdout);
int n;
cin>>n;
int ma=0;
for(int i=1;i<n;i++){
for(int j=i;j<=n;j++){
if(i==j) continue;
cin>>a[i][j];
a[j][i]=a[i][j];
}
}
for(int i=1;i<=n;i++){
sort(a[i]+1,a[i]+1+n);
ma=max(ma,a[i][n-1]);
}
cout<<1<<endl<<ma;
return 0;
}
没有时间了,所以没做这题,下次要提高做题速度。