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

      

  • 相关阅读:
    Linux内存、Swap、Cache、Buffer详细解析
    深入浅出前端本地储存
    Javscript字符串常用方法总结
    Python优雅日志记录器-Loguru
    Flume推送数据到SparkStreaming案例实战和内幕源码解密
    SparkStreaming数据源Flume实际案例分享
    基于HDFS的SparkStreaming案例实战和内幕源码解密
    Scala和Java二种方式实战Spark Streaming开发
    StreamingContext、DStream、Receiver深度剖析
    案例动手实战并在电光石火间理解其工作原理
  • 原文地址:https://www.cnblogs.com/visualVK/p/8721668.html
Copyright © 2020-2023  润新知