A
AC 100%
简单模拟题
1和本身也计入个数计算
#include<iostream>
using namespace std;
int main(){int ans = 0, n = 78120;for(int i = 1; i <= n / i; i++){if(n % i == 0){ans++;
// cout << i << " ";if(n / i != i){ans++;
// cout << n / i << " ";}}}printf("%d", ans);//96return 0;
}
B
AC 0%(填空题只输出答案即可!)
- 三种方向:横、竖、左上到右下方向(不是只有对角线)
- 输入数据规模看起来唬人,可以用记事本等直接给出行列数据。其中每行可视为一个字符串
#include<iostream>
using namespace std;
const int N = 310;
char a[N][N];
int main(){int ans = 0, n = 300, m = 301;for(int i = 0; i < n; i++){scanf("%s", a[i]);}for(int i = 0; i < n; i++){//行 for(int j = 0; j < m; j++){if(a[i][j] == '2'){if(j + 3 < m && a[i][j + 2] == a[i][j] && a[i][j + 1] == '0' && a[i][j + 3] == '0') ans++;}}}for(int j = 0; j < m; j++){//列 for(int i = 0; i < n; i++){if(a[i][j] == '2'){if(i + 3 < n && a[i + 2][j] == a[i][j] && a[i + 1][j] == '0' && a[i + 3][j] == '0') ans++;}}}for(int i = 0; i < n; i++){//左上到右下方向 for(int j = 0; j < m; j++){if(a[i][j] == '2'){if(j + 3 < m && i + 3 < n && a[i + 2][j + 2] == a[i][j] && a[i + 1][j + 1] == '0' && a[i + 3][j + 3] == '0') ans++;}}}printf("%d", ans);//16520return 0;
}
订正版
#include<iostream>
using namespace std;
const int N = 310;
char a[N][N];
int main(){// int ans = 0, n = 300, m = 301;// for(int i = 0; i < n; i++){// scanf("%s", a[i]);// }// for(int i = 0; i < n; i++){//行 // for(int j = 0; j < m; j++){// if(a[i][j] == '2'){// if(j + 3 < m && a[i][j + 2] == a[i][j] && a[i][j + 1] == '0' && a[i][j + 3] == '0') ans++;// }// }// }// for(int j = 0; j < m; j++){//列 // for(int i = 0; i < n; i++){// if(a[i][j] == '2'){// if(i + 3 < n && a[i + 2][j] == a[i][j] && a[i + 1][j] == '0' && a[i + 3][j] == '0') ans++;// }// }// }// for(int i = 0; i < n; i++){//左上到右下方向 // for(int j = 0; j < m; j++){// if(a[i][j] == '2'){// if(j + 3 < m && i + 3 < n && a[i + 2][j + 2] == a[i][j] && a[i + 1][j + 1] == '0' && a[i + 3][j + 3] == '0') ans++;// }// }// }// printf("%d", ans);//16520cout << 16520;return 0;
}
关于判断过程,可以直接对于每个2作为一个判断对象,更高效
#include<iostream>
#include<string>
using namespace std;
typedef long long ll;
const int maxn = 310, N = 300;
string s[maxn];
int main(){
// ll ans = 0;
// for(int i = 0; i < N; i++){
// cin >> s[i];
// }
// for(int i = 0; i < N; i++){
// for(int j = 0; j <= N; j++){
// if(s[i][j] == '2'){
// if(j + 3 <= N && s[i][j + 1] == '0' && s[i][j + 2] == '2' && s[i][j + 3] == '0') ans++;
// if(i + 3 < N && s[i + 1][j] == '0' && s[i + 2][j] == '2' && s[i + 3][j] == '0') ans++;
// if(i + 3 < N && j + 3 <= N && s[i + 1][j + 1] == '0' && s[i + 2][j + 2] == '2' && s[i + 3][j + 3] == '0') ans++;
// }
// }
// }
// printf("%lld\n", ans);//16520printf("16520");return 0;
}
C
AC 0%
完全没有思路
#include<iostream>
#include<cmath>
using namespace std;
int main(){long long ans = pow(2, 20) * 2;for(int i = 2; i <= 20; i++){ans += i;}printf("%lld", ans);//2097361return 0;
}
-
直线分割平面
n条直线把一个平面分割为n(n + 1) / 2 + 1个平面
即第n次增加一条直线分割后比之前新增n个平面
-
封闭图形
有n个圆形,最多把平面分割为n^2-n+2个区域
#include<stdio.h>
int main(){//n条直线可以分割出n*(n+1)/2 + 1个平面(每次加新直线时,保证新家直线和已有直线都相交且交点不重合) int ans = 20 * 21 / 2 + 1;for(int i = 1; i <= 20; i++){//每新加一个圆,都至多和一条直线分为两块,一个圆分为两块 ans += 20 * 2 + (i - 1) * 2;} printf("%d", ans); return 0;
}
D
AC 100%
用指定方式遍历二维数组
#include<iostream>
using namespace std;
const int N = 100;
int a[N][N];
int main(){int n = 100, i = 1, j = 1, cnt = 1;a[i][j] = cnt++;while(cnt < 1000){a[i][++j] = cnt++;//向左 while(j > 1){//左下 a[++i][--j] = cnt++;}a[++i][j] = cnt++;//向下while(i > 1){//右上 a[--i][++j] = cnt++;}}
// for(int i = 1; i <= 20; i++){
// printf("%d:", i);
// for(int j = 1; j <= 20; j++){
// printf("%5d", a[i][j]);
// }
// printf("\n");
// }printf("%d", a[20][20]);//761return 0;
}
E(DFS)
AC 0%
#include<iostream>
using namespace std;
int main(){int ans = 40 + 40 + 7 * 6 * 5 - 6;cout << ans;//284return 0;
}
F
AC 100%
#include<iostream>
using namespace std;
int main(){int h = -1, l = 101, n, x;double sum = 0;scanf("%d", &n);for(int i = 0; i < n; i++){scanf("%d", &x);sum += x;h = max(h, x);l = min(l, x);}printf("%d\n%d\n%.2f", h, l, sum / n);return 0;
}
G
AC 100%
日期递增+回文判断+特殊格式判断
#include<iostream>
using namespace std;
int h[2][15] = {{0, 31, 28, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}, {0, 31, 29, 31, 30, 31, 30, 31, 31, 30, 31, 30, 31}};bool sys(int y, int m, int d){//是否回文 if(y / 1000 == d % 10 && y % 1000 / 100 == d / 10 && y % 100 / 10 == m % 10 && y % 10 == m / 10) return true;return false;
}bool judge(int y, int m, int d){//是否ABAB if(y / 1000 == y % 100 / 10 && y % 1000 / 100 == y % 10) return true;return false;
}int main(){int n, y, m, d, ans1, ans2, flag1 = 1, flag2 = 1, run;scanf("%d", &n);y = n / 10000;m = n % 10000 / 100;d = n % 100;while(flag1 || flag2){run = 0;if(y % 400 == 0 || (y % 4 == 0 && y % 100 != 0)) run++;d++;if(d > h[run][m]){d = 1;m++;if(m > 12){m = 1;y++;}}if(sys(y, m, d)){if(flag1){flag1 = 0;printf("%04d%02d%02d\n", y, m, d);}if(judge(y, m, d)){flag2 = 0;printf("%04d%02d%02d", y, m, d);}}}return 0;
}
H(动态规划+DFS)
AC 0%
编译不通过,不能用time作为变量名。
不过就算是编译过了,答案也不对……
#include<iostream>
#include<unordered_map>
using namespace std;const int N = 2010;
int time[N], have[N], ans;
unordered_map<int, pair<int, int>> mp;void get(int t){ans += max(time[mp[t].first], time[mp[t].first]);have[t] = 1;if(!have[mp[t].first]) get(mp[t].first);if(!have[mp[t].second]) get(mp[t].second);
}int main(){int n, m, k, t, x, a, b, c;scanf("%d%d%d%d", &n, &m, &k, &t);for(int i = 1; i <= n; i++) scanf("%d", time + i);for(int i = 1; i <= m; i++){scanf("%d", &x);have[x]++;}while(k--){scanf("%d%d%d", &a, &b, &c);mp[c] = {a, b};}get(t);printf("%d", ans);return 0;
}
I(递推)
AC 40%
#include<iostream>
#include<vector>
#include<unordered_set>
using namespace std;int main(){string s;vector<string> vs;long long ans = 0, len;cin >> s;len = s.size();for(int i = 0; i < len; i++){for(int j = 1; j <= len; j++){if(i + j <= len) vs.push_back(s.substr(i, j));}}for(auto t : vs){unordered_set<char> sc;for(int i = 0; i < t.size(); i++) sc.insert(t[i]);ans += sc.size();}cout << ans;return 0;
}