HZNU Training 1 for Zhejiang Provincial Competition 2020

A - People Counting

 ZOJ - 3944

就是给你一张图,让你判断有多少个人,

算是个观察题吧,因为,一个人身上所有的点除了 .   以外,其他部件只有一个。

从上往下,找到一个特殊部件就把他变成 .  ;然后把匹配的是一个人的部件变成  . ;

问题解决;

也可以怎么想:就是人的形状就是个3*3的矩形框里,将这个矩形框从左往右,从上到下,在矩阵里进行比对,如果有对应相同的部分,那么这里就有一个人。
直接从左上角遍历到右下角就可以。但你要将矩阵扩充出来,这样避免了判越界;

正解确实是个好办法,因为位置一旦变了,肯定就不是原来那个形状了。

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second 11
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-9;
const ll MOD=1e9+9;
const int maxn=1e9+5;
char mp[200][200];
bool check(int i,int j){
 if (mp[i][j + 1] == 'O' || mp[i + 1][j] == '/' || mp[i + 1][j + 1] == '|' || 
        mp[i + 1][j + 2] == '\' || 
        mp[i + 2][j] == '(' || mp[i + 2][j + 2] == ')')
        return 1;
    else return 0;
}
int main(){
    int n,m,t;
    cin>>t;
    while(t--){
    // memset(mp,-1,sizeof mp);
    scanf("%d %d",&n,&m);
    for(int i=2;i<=n+1;i++){
     getchar();
    for(int j=2;j<=m+1;j++){
    scanf("%c",&mp[i][j]);
    }
    
    }
    int ans=0;    
    for(int i=0;i<=n+1;i++){
    for(int j=0;j<=m+1;j++){
    if(check(i,j))ans++;
    }
    }
    printf("%d
",ans);
    
    }
    system("pause");
    return 0;
}
View Code

D - Almost Equal

 CodeForces - 1205A 

题意:就是说给你一个n,我们需要构造一个长度为2n 的环,数字分别为1 ~ 2n,使环上每n个连续的点的记录下来。其中这些数要求只有2个数字构成,并且这两个数必须连续。没有为NO, 有的则输出YES 和方案。

解法:

每个点会在n个环上,所以所有环的总和为sum = (1 + 2 + … + 2 * n) * n.
一共有2n个环所以两个不同和的环的和(有点绕)为rsum = sum / n, 即为rsum = (1 + 2 + … 2 * n).
所以rsum 是偶数时,则无法分为两个连续的自然数。无解。
取法:看样例;1往下取,n+1往上取,一个轮回倒着一下;

感觉这种题看少了;

#include<bits/stdc++.h>
using namespace std;
#define rep(i,j,k) for(int i=(int)j;i<=(int)k;i++)
#define per(i,j,k) for(int i=(int)k;i>=(int)j;i--)
#define pb push_back
#define pf push_front
#define fi first
#define se second 11
typedef long long ll;
typedef unsigned long long ull;
typedef long double ldb;
typedef double db;
const db PI=acos(-1.0);
const ll INF=0x3f3f3f3f3f3f3f3fLL;
const int inf=0x3f3f3f3f;//0x7fffffff;
const double eps=1e-9;
const ll MOD=9999991;
const int maxn=1e5+5;
ll sum[maxn],f[maxn];
int a[maxn];
int main(){
    int n;
    cin>>n;
    ll rsum=(2*n+1)*n;
    if(rsum%2==0){
    printf("NO
");
    return 0;
    }
    printf("YES
");
    a[1]=1;
    a[n+1]=2;
    int q=2,h=n+2;
    int now=2;
    for(int i=1;i<n;i++){
    if(i%2){
    a[h++]=++now;
    a[q++]=++now;
    }
    else {
    a[q++]=++now;
    a[h++]=++now;
    }
    }
    for(int i=1;i<=2*n;i++){
    printf("%d%c",a[i],i==2*n?'
':' ');
    }
    return 0;
}
View Code

E - Citations

 Gym - 101853K 

这题给我吓得不轻,字符串大模拟;

K - Simple Skewness

 CodeForces - 626E 

题意:给你一段序列,要你求子集,使得平均数-中位数最小。

枚举中位数,三分区间,学了再补充;

想的太多,做的太少;
原文地址:https://www.cnblogs.com/littlerita/p/12392869.html