3 条题解
-
2
#include<bits/stdc++.h> using namespace std; string a,b; int ans; int main(){ ios::sync_with_stdio(false); // 输入输出加速 cin.tie(0); cout.tie(0); cin>>a>>b; int len=a.size(); // 优化时间复杂度(效果不明显) for(int i=0;i<len-1;i++){ if(a[i]!=b[i]){ if(a[i]=='N')a[i]='S'; else a[i]='N'; if(a[i+1]=='N')a[i+1]='S'; else a[i+1]='N'; ans++; } } cout<<ans; return 0; }
-
0
首先要明确两点:
1.对于任意连着的两个同学来说,转一次以上都是没有意义的,因为转两次相当于没转,转三次相当于转了一次……
2.题目说保证有解,那么我们就可以从前往后递推,首先对于第一个同学来说,如果他需要转变方向,那么只有他和第二个同学向后转这一种方法,将第一个同学安置好之后,继续往后看。第二个同学也是一样的,如果需要转向,只能是他和第三个同学一起转,以此类推……只需要判断到倒数第二个同学即可。代码的话就是模拟上面的一段过程,具体代码如下:
#include <bits/stdc++.h> using namespace std; string a, b; int main() { cin >> a >> b; int ans = 0; for (int i = 0; i < a.size() - 1; i++) { if (a[i] != b[i]) { ans ++; if (a[i] == 'N') a[i] = 'S'; else a[i] = 'N'; if (a[i + 1] == 'N') a[i + 1] = 'S'; else a[i + 1] = 'N'; } } cout << ans; return 0; }
-
-2
//用while循环不知道有没有用递推(100分) #include <iostream> using namespace std; string a, b; long long sum = 0, num = 0; int main() { cin >> a >> b;
while (a != b) { num %= a.length(); if (a == b) { break; } if (a[num] != b[num]) { int t = a[num]; a[num] = b[num]; if (a[num + 1] == 'S') { a[num + 1] = 'N'; sum++; } else { a[num + 1] = 'S'; sum++; } } num++; } cout << sum; return 0;
}
- 1
信息
- ID
- 1221
- 时间
- 1000ms
- 内存
- 256MiB
- 难度
- 4
- 标签
- 递交数
- 194
- 已通过
- 87
- 上传者