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

浙公网安备 33010602011771号