A - People Counting
就是给你一张图,让你判断有多少个人,
算是个观察题吧,因为,一个人身上所有的点除了 . 以外,其他部件只有一个。
从上往下,找到一个特殊部件就把他变成 . ;然后把匹配的是一个人的部件变成 . ;
问题解决;
也可以怎么想:就是人的形状就是个3*3的矩形框里,将这个矩形框从左往右,从上到下,在矩阵里进行比对,如果有对应相同的部分,那么这里就有一个人。
直接从左上角遍历到右下角就可以。但你要将矩阵扩充出来,这样避免了判越界;
正解确实是个好办法,因为位置一旦变了,肯定就不是原来那个形状了。
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
D - Almost Equal
题意:就是说给你一个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往上取,一个轮回倒着一下;
感觉这种题看少了;
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#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; }
E - Citations
这题给我吓得不轻,字符串大模拟;
K - Simple Skewness
题意:给你一段序列,要你求子集,使得平均数-中位数最小。
枚举中位数,三分区间,学了再补充;