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;
}

没有时间了,所以没做这题,下次要提高做题速度。