A题 解题思路:
本题要求在每两个珠子之间存在相同数目的链,只要判断 链条的数目 % 珠子的数目 是否为 0即可,但是要注意细节,当没有珠子或者没有链条的话,也是可以的 。
#include <iostream>
#include <cstdio>
#include <cstring>
using namespace std;
int main(){
string st;
cin>>st;
int a = 0, b = 0;
for (int i = 0; i < st.length();i ++){
if (st[i] == '-'){
a ++;
}
else{
b ++;
}
}
if (b == 0){
puts("YES");
return 0;
}
if (a == 0){
printf("YES\n");
return 0;
}
if (a % b == 0){
puts("YES");
}
else puts("NO");
return 0;
}
(这套题读题把自己毒死了)
让标出位置,要求最短路径的数目相同(好好感受下),可以想到对称。
就是走最短路径走过的旅店数目是相同的,可以想到对称。
- 如果是偶数:那么在第二 、三行排着赋值就OK
- 如果是奇数,那么从中间向两边排,这里有一个技巧就是先排好中间的,然后从这一行的两边开始填(第三行直接从两边开始填就OK)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 110;
char g[N][N];
int main(){
int n, m;
scanf("%d%d",&n,&m);
for (int i = 0 ; i < 4; i++){
for (int j = 0; j < n; j++){
g[i][j] = '.';
}
}
int a = 1, b = 1;
if (m % 2 == 0){
while(m != 0){
if (m % 2 == 0){
g[1][a++] = '#';
}
else{
g[2][b++] = '#';
}
m--;
}
}
else{
if (m <= n - 2){
g[1][n/2] = '#';
for (int i = 1; i <= (m - 1) / 2;i ++){
g[1][i] = '#';
g[1][n - 1 - i] = '#';
}
}
else{
for (int i = 1; i < n - 1; i++){
g[1][i] = '#';
}
m -= n - 2;
for (int i = 1; i <= m / 2; i++){ // 对于这里上面已经处理奇数,所以剩偶数
g[2][i] = '#';
g[2][n - 1 - i] = '#';
}
}
}
printf("YES\n");
for (int i = 0; i < 4; i++){
puts(g[i]);
}
return 0;
}
这题比较迷(读不懂题)
要求分组,每组的大小不超过 k ,首先判断当前的值是否在分组中,如果不在,那么我们向前从ans[ i ] - k + 1 向后找,因为为了使字典序最小,我们判断当前的点是否已经分组,如果没分组那么我们从当前的位置到 ans[ i ] 进行赋值,赋值为最小值也就是 t ,然后进行输出。
(注释中稍微解释下)
#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
using namespace std;
const int N = 310;
int a[100010];
int ans[100010];
int main(){
memset(a,-1,sizeof a); // 将其赋值都为 -1,代表没有赋值过
int n, k;
scanf("%d%d",&n,&k);
for (int i = 0; i < n; i++){
scanf("%d",&ans[i]);
if (a[ans[i]] == -1){ // 如果当前的值没有分组,那么进行赋值
int t = ans[i] - k + 1; // 从头开始
t = max(0,t); // 如果小于 0 , 那么我们从 0 开始
while(a[t] != -1 && a[t] != t) t ++; // 如果当前的值被赋值,并且赋的值不是自己 那么 t ++ (如果是自己,那么肯定是最小值)
for (int j = t; j <= ans[i]; j++){ // 都赋值为最小值
a[j] = t;
}
}
}
for (int i = 0; i < n; i++){
if (i == n -1){
printf("%d\n",a[ans[i]]);
}
else printf("%d ",a[ans[i]]);
}
}