Educational Codeforces Round 41 (Rated for Div. 2)
A. Tetris
题目
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
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; }