Educational Codeforces Round 41 (Rated for Div. 2)

A. Tetris

题目

1 给你一个以下过程。 有一个有n列的平台。在这个平台上的一些列中,1×1个方格正在接连出现。如果列中没有正方形,则正方形将占据底部的一行。否则,正方形将出现在此列最高平方的顶部。 当所有n列中至少有一个正方形时,最下面一行将被删除。你将得到1分,剩下的所有方格将会下降一排。 你的任务是计算你将得到的积分的数量。
题目

  

实际上就是想让你记下n以内的所有数的个数,然后输出那个数字的数目最小

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define pb push_back
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>PLL;
typedef pair<int,ll>Pil;
const ll INF = 0x3f3f3f3f;
const double inf=1e8+100;
const double eps=1e-8;
const int maxn =1e3+100;
const int N = 1e2;
const ll mod=1e9+7;
//------
//define
int a[maxn]; 
//solve
void solve() {
	int n,m;
	cin>>n>>m;
	int t=m;
	while(t--){
		int x;
		cin>>x;
		a[x]++;
	}
	int ans=INF;
	for(int i=1;i<=n;i++){
		ans=min(ans,a[i]);
	}
	cout<<ans<<endl;
}
//main
int main() {
	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	cin.tie(0);
	cout.tie(0);
	solve();
	/*
		#ifdef debug
			fclose(stdin);
			fclose(stdout);
			system("out.txt");
		#endif
	*/
	return 0;
}

 B. Lecture Sleep

有个人喜欢微积分,但是微积分太难,让他想睡觉,而现在你有一个技能,可以让他在[i,i+k-1]分钟之内都是醒着听课,但是只能用一次,你的任务就是怎么利用这个技能让他的听得东西最多

分析:利用尺取法(挑战程序设计P146,这里就不介绍了)算的取哪一段有睡觉的时间来听课可以听的东西最多

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define pb push_back
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>PLL;
typedef pair<int,ll>Pil;
const ll INF = 0x3f3f3f3f;
const double inf=1e8+100;
const double eps=1e-8;
const int maxn =1e6+100;
const int N = 1e2;
const ll mod=1e9+7;
//------
//define
int a[maxn];
int sum;
//solve
void solve() {
	int n,k,init=0;
	cin>>n>>k;
	for(int i=0;i<n;i++){
		cin>>a[i];
	}
	for(int i=0;i<n;i++){
		int x;
		cin>>x;
		if(x){
			init+=a[i];
			a[i]=0;
		}
	}
	int ans=-1;
	for(int i=0;i<n;i++){
		if(i<k){
			sum+=a[i];
		}else{
			if(i-k>=n)break;
			sum=sum+a[i]-a[i-k];
		}
	//	cout<<i<<":"<<sum<<" "<<a[i]<<" "<<a[i-k]<<endl;
		ans=max(ans,sum);
	}
	cout<<ans+init<<endl;
}
//main
int main() {
	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	cin.tie(0);
	cout.tie(0);
	solve();
	/*
		#ifdef debug
			fclose(stdin);
			fclose(stdout);
			system("out.txt");
		#endif
	*/
	return 0;
}

  C. Chessboard

完整的一个棋盘被分成了4小块,但是某一些小块上的颜色也不对,问你最少要改变几块,才能将他拼成一块大的有效棋盘

分析:数据比较小,直接用next_permuation来枚举这4块应该怎么拼

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define pb push_back
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>PLL;
typedef pair<int,ll>Pil;
const ll INF = 0x3f3f3f3f;
const double inf=1e8+100;
const double eps=1e-8;
const int maxn =1e6+100;
const int N = 1e2;
const ll mod=1e9+7;
//------
//define
int n,a[3000][3000];
char tabel[4][110][110];
int ans=INF;
//test
void test(){
	int tmp=0;
	for(int i=0;i<2*n;i++){
		for(int j=0;j<2*n;j++){
			if(a[i][j]!=('0'+(int)(i+j)%2))
			tmp++;
		}
	}
	ans=min(ans,tmp);
}
//solve
void solve() {
	cin>>n;
	for(int i=0;i<4;i++){
		for(int j=0;j<n;j++){
			for(int k=0;k<n;k++)
			cin>>tabel[i][j][k];
		}
	}
	int g[]={0,1,2,3};
	do{
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				a[i][j]=tabel[g[0]][i][j];
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				a[i][j+n]=tabel[g[1]][i][j];
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				a[i+n][j]=tabel[g[2]][i][j];
			}
		}
		for(int i=0;i<n;i++){
			for(int j=0;j<n;j++){
				a[i+n][j+n]=tabel[g[3]][i][j];
			}
		}
		test();
	}while(next_permutation(g,g+4));
	cout<<ans<<endl;
}
//main
int main() {
	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	cin.tie(0);
	cout.tie(0);
	solve();
	/*
		#ifdef debug
			fclose(stdin);
			fclose(stdout);
			system("out.txt");
		#endif
	*/
	return 0;
}

  D. Pair Of Lines

题目要求你检验是否存在两条直线,让给定的点都在这两线上

分析:当给出的点<=4是肯定存在,我们重点研究>4的情况。因为是检验存不存在两条直线让其他的点都在线上,因此,我们可以随便取3个点,来验证除这3个点外的点是不是都在线上。详细看代码

#define debug
#include<stdio.h>
#include<math.h>
#include<cmath>
#include<queue>
#include<stack>
#include<string>
#include<cstring>
#include<string.h>
#include<algorithm>
#include<iostream>
#include<vector>
#include<functional>
#include<iomanip>
#include<map>
#include<set>
#define pb push_back
#define dbg(x) cout<<#x<<" = "<<(x)<<endl;
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll>PLL;
typedef pair<int,ll>Pil;
const ll INF = 0x3f3f3f3f;
const double inf=1e8+100;
const double eps=1e-8;
const int maxn =1e5+100;
const int N = 1e2;
const ll mod=1e9+7;
//------
//define
struct node{
	ll x,y;
	node(int x=0,int y=0):x(x),y(y){}
}a[maxn];
//test
bool test(ll x,ll y,ll z){
	return (a[x].y-a[y].y)*(a[x].x-a[z].x)==(a[x].y-a[z].y)*(a[x].x-a[y].x);
}
vector<ll>v;
//solve
void solve() {
	int n;
	cin>>n;
	for(int i=0;i<n;i++){
		ll x,y;
		cin>>x>>y;
		a[i]=node(x,y);
	}
	if(n<=4){
		cout<<"YES"<<endl;
		return;
	}
	if(test(0,1,2)){//三个点在同一直线上 
		for(int i=3;i<n;i++){
			if(!test(0,1,i)){
				v.push_back(i);
			}
		}
		for(int i=2;i<v.size();i++){
			if(!test(v[0],v[1],v[i])){
				cout<<"NO"<<endl;
				return;
			}
		}
		cout<<"YES"<<endl;
	}else{//三个点不在同一直线上,这时有其中一条直线的斜率有三种情况 
		int flag=1;
		v.push_back(2);
		for(int i=3;i<n;i++){
			if(!test(0,1,i)){
				v.push_back(i);
			}
		}
		for(int i=2;i<v.size();i++){
			if(!test(v[0],v[1],v[i])){
			//	cout<<a[v[i]].x<<" "<<a[v[i]].y<<endl;
			//	cout<<"NO"<<endl;
			flag=0;
			}
		}
		if(flag){
			cout<<"YES"<<endl;
			return;
		}
		//---- 
		v.clear();
		flag=1;
		v.push_back(1);
		for(int i=3;i<n;i++){
			if(!test(0,2,i)){
				v.push_back(i);
			}
		}
		for(int i=2;i<v.size();i++){
			if(!test(v[0],v[1],v[i])){
				//cout<<a[v[i]].x<<" "<<a[v[i]].y<<endl;
				//cout<<"NO"<<endl;
				flag=0;
			}
		}
		if(flag){
			cout<<"YES"<<endl;
			return;
		}
		///---- 
		v.clear();
		flag=1;
		v.push_back(0);
		for(int i=3;i<n;i++){
			if(!test(1,2,i)){
				v.push_back(i);
			}
		}
		for(int i=2;i<v.size();i++){
			if(!test(v[0],v[1],v[i])){
			//	cout<<"NO"<<endl;
			flag=0;
			}
		}
		if(flag){
			cout<<"YES"<<endl;
			return;
		}
		cout<<"NO"<<endl;
	}
}
//main
int main() {
	ios_base::sync_with_stdio(false);
#ifdef debug
	freopen("in.txt", "r", stdin);
//	freopen("out.txt","w",stdout);
#endif
	cin.tie(0);
	cout.tie(0);
	solve();
	/*
		#ifdef debug
			fclose(stdin);
			fclose(stdout);
			system("out.txt");
		#endif
	*/
	return 0;
}

  

原文地址:https://www.cnblogs.com/visualVK/p/8721668.html