- 赵一静 的博客
八月暑期集训8月6日DAY2题解
- @ 2024-8-6 17:40:42
超速罚单(模拟)
思路没想到的原因
没有想到的情况,所以只骗了分。
思路
枚举每一公里是否超速,求最后求一个max值。
代码
#include <bits/stdc++.h>
using namespace std;
const int tt=1e4+10;
int a[tt],b[tt],c[tt],d[tt];
int s1[tt],s2[tt];
int main(){
freopen("speeding.in","r",stdin);
freopen("speeding.out","w",stdout);
int n,m;
int ans=0;
cin >>n>>m;
for(int i=1;i<=n;i++){
cin >>a[i]>>b[i];
s1[i]=s1[i-1]+a[i];
}
for(int i=1;i<=m;i++){
cin >>c[i]>>d[i];
s2[i]=s2[i-1]+c[i];
}
int j=1,k=1;
for(int i=1;i<=100;i++){
if(i>s1[j]) j++;
if(i>s2[k]) k++;
ans=max(ans,d[k]-b[j]);
}
cout <<ans;
return 0;
}
自助饮料(模拟)
思路没想到的原因
当时只有一点思路,我对模拟的运用还不够。以后要多练习。
思路
用一个数组模拟个接水口前排队的人,不断排序,让新的人排在剩余时间最短的队伍前,找出所需时间最长的队伍。
代码
#include <bits/stdc++.h>
using namespace std;
const int tt=1e4+10;
int a[tt],s[tt];
vector<int> q;
int main(){
freopen("drink.in","r",stdin);
freopen("drink.out","w",stdout);
int n,m;
int ans=0;
cin >>n>>m;
for(int i=1;i<=n;i++){
cin >>a[i];
q.push_back(a[i]);
}
reverse(q.begin(),q.end());
while(q.size()){
int t=q.size(),y=min(t,m);
for(int i=0;i<y;i++){
s[i]=q.back();
q.pop_back();
}
for(int i=y-1;i>=0;i--){
s[i]--;
if(s[i]>0){
q.push_back(s[i]);
}
}
ans++;
}
cout <<ans;
return 0;
}
PvZ 竞赛版(模拟+贪心+枚举)
思路没想到的原因
当时一点思路都没有,以后多练习。
思路
按照题目提示的公式来写就行了,注意输入输出别写错了!
代码
#include <bits/stdc++.h>
using namespace std;
const int tt=1e5+50;
int x_1,y_1,x_2,y_2,n;
pair<int,int> a[tt];
int w(int t){
return t*t;
}
bool cmp(pair<int,int> a,pair<int,int> b){
return w(abs(x_1-a.first))+w(abs(y_1-a.second))>w(abs(x_1-b.first))+w(abs(y_1-b.second));
}
int main(){
freopen("pvz.in","r",stdin);
freopen("pvz.out","w",stdout);
int ans=1e9;
cin >>x_1>>y_1>>x_2>>y_2>>n;
for(int i=1;i<=n;i++){
cin >>a[i].first>>a[i].second;
}
sort(a+1,a+1+n,cmp);
int p=0;
for(int i=1;i<=n;i++){
int x=a[i].first;
int y=a[i].second;
int xs=w(x_1-x)+w(y_1-y);
ans=min(ans,xs+p);
int xs_2=w(x_2-x)+w(y_2-y);
p=max(p,xs_2);
}
cout <<ans;
return 0;
}
三国游戏(模拟)
思路没想到的原因
对于本题,自己认为题目太过复杂(后面才知道其实并不复杂),暴力与优化都不想也想不到思路。下次我会尽力(因为有些真的难知识面过于深奥) 。
思路
因为电脑会破坏我们能组成的最大值,因此所有最大值都必定会被破坏。 所以实际上就是在一个二维数组内找每一行的次大值的最答值,之后由于最大的次大值已被我们拿到,因此我们必胜。
👀️代码
#include <bits/stdc++.h>
using namespace std;
int a[510][510];
int max_n=0,max_m=0,max_ans=0;
int main(){
freopen("sg.in","r",stdin);
freopen("sg.out","w",stdout);
int n;
cin >>n;
for(int i=1;i<=n;i++){
for(int j=i+1;j<=n;j++){
cin >>a[i][j];
a[j][i]=a[i][j];
}
}
for(int i=1;i<=n;i++){
max_n=0;
max_m=0;
for(int j=1;j<=n;j++){
if(j==i) continue;
max_n=max(max_n,a[i][j]);
}
for(int j=1;j<=n;j++){
if(j==i||a[i][j]==max_n) continue;
max_m=max(a[i][j],max_m);
}
max_ans=max(max_ans,max_m);
}
cout <<"1"<<endl;
cout <<max_ans;
return 0;
}