超速罚单(模拟)

思路没想到的原因

没有想到n!=mn!=m的情况,所以只骗了2020分。

思路

枚举每一公里是否超速,求最后求一个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;
}

自助饮料(模拟)

思路没想到的原因

当时只有一点思路,我对模拟的运用还不够。以后要多练习。

思路

用一个数组模拟mm个接水口前排队的人,不断排序,让新的人排在剩余时间最短的队伍前,找出所需时间最长的队伍。

代码

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

谢谢