1050(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81569622)
1.建立坐标系,将几个关键位置的坐标写出来,方便思考
2.注意不要产生数据的位置重叠,否则会有数据被覆盖
3.m、n与level的确定:求出N的开方数,向下取整。从此数开始,向下判断是否可被N整除,若可以则此数为n,得到n后便可求m。level为m除以2向上取整
#include<iostream>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
bool cmp(int a, int b){
return a > b;
}
int main(){
int N;
cin >> N;
vector<int> v(N);
for(int i = 0; i < N; i++){
cin >> v[i];
}
sort(v.begin(), v.end(), cmp);
int temp = sqrt(N);
while(temp != 0){
if(N % temp == 0){
break;
}
temp--;
}
int n = temp;
int m = N / n;
int level = m / 2 + m % 2;
vector<vector<int> > arr(m);
for(int i = 0; i < m; i++){
arr[i].resize(n);
}
int index = 0;
for(int i = 0; i < level; i++){
for(int j = i; j < n - i - 1 && index < N; j++){
arr[i][j] = v[index++];
}
for(int j = i; j < m - i - 1 && index < N; j++){
arr[j][n - i - 1] = v[index++];
}
for(int j = n - i - 1; j > i && index < N; j--){
arr[m - i -1][j] = v[index++];
}
for(int j = m - i - 1; j > i && index < N; j--){
arr[j][i] = v[index++];
}
}
for(int i = 0; i < m; i++){
for(int j = 0; j < n; j++){
if(j != n - 1){
cout << arr[i][j] << ' ';
}else{
cout << arr[i][j] << endl;
}
}
}
return 0;
}
1051(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81518044)
1.注意A与B在>=-0.005, < 0时输出0.00
#include<iostream>
#include<cmath>
using namespace std;
int main(){
double R1, P1, R2, P2;
cin >> R1 >> P1 >> R2 >> P2;
double A1 = R1 * cos(P1), B1 = R1 * sin(P1);
double A2 = R2 * cos(P2), B2 = R2 * sin(P2);
double A = A1 * A2 - B1 * B2, B = A1 * B2 + B1 * A2;
if(A >= -0.005 && A <= 0){
printf("0.00");
}else{
printf("%.2lf", A);
}
if(B >= -0.005 && B <= 0){
printf("+0.00i\n");
}else if(B > 0){
printf("+%.2lfi\n", B);
}else{
printf("%.2lfi\n", B);
}
return 0;
}
1052(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81532761)
1.无开头结尾的输入输出采用字符串整行输入
2.注意所需符号为字符串时,可以先设一空串,将字符逐个与之相加得到所需符号
#include<iostream>
#include<vector>
#include<string>
using namespace std;
int main(){
vector<string> v[3];
for(int i = 0; i < 3; i++){
string s;
getline(cin, s);
for(int j = 0; j < s.size(); j++){
string temp = "";
if(s[j] == '['){
int index = j + 1;
while(s[index] != ']'){
temp += s[index++];
}
v[i].push_back(temp);
}
}
}
int N;
cin >> N;
for(int i = 0; i < N; i++){
int H1, E1, M, E2, H2;
cin >> H1 >> E1 >> M >> E2 >> H2;
H1--;
E1--;
M--;
E2--;
H2--;
if(H1 < v[0].size() && E1 < v[1].size() && M < v[2].size() &&
E2 < v[1].size() && H2 < v[0].size()){
printf("%s(%s%s%s)%s\n", v[0][H1].c_str(), v[1][E1].c_str(), v[2][M].c_str(), v[1][E2].c_str(), v[0][H2].c_str());
}else{
cout << "Are you kidding me? @\\/@" << endl;
}
}
return 0;
}
1054(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81588389)
1.思路:向s1输入字符串,用sscanf从s1向d输入浮点数(无需限制数位),然后用sprintf从d向s2输入字符串,若s1与s2相同则合法
2.s1、s2最好用字符数组,且长度最好设在50以上,否则会RE
#include<iostream>
#include<cmath>
#include<cstring>
using namespace std;
int main(){
int N;
cin >> N;
double ans = 0;
int cnt = 0;
for(int i = 0; i < N; i++){
char s1[50], s2[50];
double d;
scanf("%s", s1);
sscanf(s1, "%lf", &d);
sprintf(s2, "%.2lf", d);
bool isValid = true;
for(int j = 0; j < strlen(s1); j++){
if(s1[j] != s2[j]){
isValid = false;
break;
}
}
if(isValid == true && fabs(d) <= 1000){
ans += d;
cnt++;
}else{
printf("ERROR: %s is not a legal number\n", s1);
}
}
if(cnt == 0){
cout << "The average of 0 numbers is Undefined" << endl;
}else if(cnt == 1){
printf("The average of %d number is %.2lf\n", cnt, ans);
}else{
printf("The average of %d numbers is %.2lf\n", cnt, ans / cnt);
}
return 0;
}
1055(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81589975)
1.完成输入数据、排序等任务后,从最后一行开始,两个循环从中间向两边输出
2.将行数作为变量进行循环
#include<iostream>
#include<algorithm>
#include<vector>
#include<string>
using namespace std;
struct Stu{
string name;
int height;
};
bool cmp(Stu a, Stu b){
if(a.height != b.height){
return a.height > b.height;
}else if(a.name != b.name){
return a.name < b.name;
}
}
int main(){
int N, K;
cin >> N >> K;
getchar();
vector<Stu> v(N);
for(int i = 0; i < N; i++){
cin >> v[i].name >> v[i].height;
}
sort(v.begin(), v.end(), cmp);
int row = K;
int index = 0;
int m;
while(row != 0){
if(row == K){
m = N / K + N % K;
}else{
m = N / K;
}
vector<Stu> line(m);
int i1 = index;
int i2 = index + 1;
for(int i = m / 2; i < line.size(); i++, i1 += 2){
line[i] = v[i1];
}
for(int i = m / 2 - 1; i >= 0; i--, i2 += 2){
line[i] = v[i2];
}
for(int i = 0; i < line.size(); i++){
if(i != line.size() - 1){
cout << line[i].name << ' ';
}else{
cout << line[i].name << endl;
}
}
index += m;
row--;
}
return 0;
}
1060(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81613325)
1.E的值不应当直接从数列中取,因为E可能为不存在于数列中的数
2.第N个数应大于N而不是大于等于N(v[i] > i + 1)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
bool cmp(int a, int b){
return a > b;
}
int main(){
int N;
cin >> N;
vector<int> v(N);
for(int i = 0; i < N; i++){
cin >> v[i];
}
sort(v.begin(), v.end(), cmp);
int E = 0;
for(int i = 0; i < v.size(); i++){
if(v[i] <= i + 1){
break;
}
E++;
}
cout << E << endl;
return 0;
}
1068(题目及原解答https://blog.csdn.net/g28_gwf/article/details/81674523)
1.所符合要求的点并不是周围八个均色差充分大,而是没有不超过TOL的点
#include<iostream>
#include<cmath>
#include<map>
#define maxN 1001
using namespace std;
long pic[maxN][maxN] = {0};
int dire[8][2] = {{-1, -1}, {0, -1}, {1, -1}, {-1, 0}, {1, 0}, {-1, 1}, {0, 1}, {1, 1}};
int main(){
map<int, int> m;
long M, N, TOL;
cin >> M >> N >> TOL;
for (int i = 0; i < N; i++) {
for (int j = 0; j < M; j++) {
cin >> pic[i][j];
m[pic[i][j]]++;
}
}
bool isUnique = true;
bool isExist = false;
int x, y;
long value;
for(int i = 0; i < N; i++){
for(int j = 0; j < M; j++){
bool isValid = true;
if(m[pic[i][j]] == 1){
int cnt = 0;
for(int k = 0; k < 8; k++){
int ni = i + dire[k][0];
int nj = j + dire[k][1];
if(ni >= 0 && ni < N && nj >= 0 && nj < M && abs(pic[ni][nj] - pic[i][j]) <= TOL){
cnt++;
}
}
if(cnt == 0){
if(isExist == false){
x = j + 1;
y = i + 1;
value = pic[i][j];
isExist = true;
}else if(isExist == true){
isUnique = false;
}
}
}
}
}
if (isExist == false) {
cout << "Not Exist" << endl;
}
if (isUnique == false) {
cout << "Not Unique" << endl;
}
if (isExist == true && isUnique == true) {
printf("(%d, %d): %ld\n", x, y, value);
}
return 0;
}