T1:
考察基本表达式和最值函数
#include<iostream>
#include<stdio.h>//文件输入输出需要用到的头文件
using namespace std;
int a,b,c,s,ma;
int main(){
freopen("exam.in","r",stdin);
freopen("exam.out","w",stdout);
cin>>a>>b>>c;
s=a+b+c;
ma=max(max(a,b),c);
cout<<s<<" "<<ma<<endl;
return 0;
}
T2
/*
考察点1:数字分解,预计得分 40
考察点2:字符数组、ascii码,累加和
*/
#include<bits/stdc++.h>
using namespace std;
int l,sum=0;
char s[10009];
int main(){
freopen("bit.in","r",stdin);
freopen("bit.out","w",stdout);
cin>>l;
cin>>s;//注意用字符串处理,数字的长度已经超过了long long 类型
for(int i=0;i<l;i++){
sum+=s[i]-'0';
}
cout<<sum<<endl;
return 0;
}
T3
考察点:容斥。
这道题在考试中得分率比较低,小学生对平面直角坐标系理解和掌握的较少。找矩形的交集对很多考生来说是难点。
/*
1.给定的矩形描述不一定是哪个两个对角线上的点,需要整理成统一的的左上角、右下角描述
2. 部分分n==1的情况容易处理:长×宽即可
3. n==2分两种情况
两个矩形分离
两个矩形有交集
需要注意的点:数据范围为10000*100000,要用long long 类型。
*/
#include <iostream>
#include <iomanip>
#include<stdio.h>
using namespace std;
typedef long long ll;
struct node{//左上角 和右下角
ll xa,ya,xb,yb;
}jx1,jx2,jx3;
int n;
node le_ri(){
node t;
cin>>t.xa>>t.ya>>t.xb>>t.yb;
if(t.xa>t.xb)swap(t.xa,t.xb);
if(t.ya>t.yb)swap(t.ya,t.yb);
return t;
}
ll s(node t){
return (t.xb-t.xa)*(t.yb-t.ya);
}
int main()
{
freopen("garden.in","r",stdin);
freopen("garden.out","w",stdout);
cin>>n;
jx1=le_ri();
if(n==1){
cout<<s(jx1)<<endl;
return 0;
}
jx2=le_ri();
if(jx1.xa>=jx2.xb||jx1.xb<=jx2.xa||jx1.ya>=jx2.yb||jx1.yb<=jx2.ya) {//2在1的左侧,右侧,下侧,上侧
cout<<s(jx1)+s(jx2)<<endl;
return 0;
}
//相交的情况
jx3.xa=max(jx1.xa,jx2.xa);
jx3.xb=min(jx1.xb,jx2.xb);
jx3.ya=max(jx1.ya,jx2.ya);
jx3.yb=min(jx1.yb,jx2.yb);
cout<<s(jx1)+s(jx2)-s(jx3)<<endl;
}
T4
/*
部分分1:考察数学与循环 50分
部分分2:N很大,循环超时,要优化。
N%i==0的情况下,i,N/i都是因子,找到小的,一定能对应到另一个大的。
小的最大多大呢?sqrt(N)
*/
#include <bits/stdc++.h>
using namespace std;
typedef long long LL;
int main()
{
freopen("gem.in","r",stdin) ;
freopen("gem.out","w",stdout);
LL N,M;scanf("%lld%lld",&N,&M);
LL ans=1;
for(LL i=1;i*i<=N;++i)if(N%i==0)
{
if(i<=M) ans=max(ans,i);
if(N/i<=M) ans=max(ans,N/i);
}
printf("%lld\n",N/ans);
return 0;
}
T5
//数据范围小,本题考察递归、回溯。算法是深度优先搜索
#include <iostream>
using namespace std;
long long a[12],ans=0x7fffffffffffffff;
//初始化ans无限大
int n;
char ope[12];//记录操作字符
bool vis[12];//状态数组
void dfs(int cur) {
int i,j;
if(cur==n-1) { //回溯条件明确
for(i=0; i<n; i++) {
if(!vis[i])
ans=min(ans,a[i]);//没有被记录的数就是最终结果,求最小
}
return ;//回溯
}
for(i=0; i<n; i++) {
for(j=0; j<n; j++) {
if(i==j||vis[i]||vis[j]) continue;
//若为同一个数或已被选用,跳过
long long p=a[i];
vis[j]=1;
if(ope[cur]=='+')
a[i]+=a[j];
else if(ope[cur]=='*')
a[i]*=a[j];
dfs(cur+1);
vis[j]=0;
a[i]=p;//还原
}
}
}
int main() {
// cout<<(long long)850*957*975*935<<endl;
freopen("smallest.in","r",stdin);
freopen("smallest.out","w",stdout);
int i;
cin>>n;
for(i=0; i<n; i++) cin>>a[i];
for(i=0; i<n-1; i++) cin>>ope[i]; //输入
dfs(0);
cout<<ans;
return 0;
}
/*
7 17 3 25
+ * +
17+25=42
3*7=21
42+21=63
*/
T6
/*本题考察宽度优先搜索。镜像处理起来比较麻烦
在搜索的过程中记录前驱,以便输出路径。
*/
#include <bits/stdc++.h>
using namespace std;
const int maxn = 25;
char s1[maxn][maxn], s2[maxn][maxn];
int vis[maxn][maxn][maxn][maxn];
array<int,4> pre[maxn][maxn][maxn][maxn];
char ans[maxn][maxn][maxn][maxn];
int step[maxn][maxn][maxn][maxn];
vector<char>rec;
queue<array<int,4>>q;
void down(int x, int y, int x_, int y_) {
int dx = x, dy = y, dx_ = x_, dy_ = y_;
if(s1[x + 1][y] == '.') dx++;
if(s2[x_ + 1][y_] == '.') dx_++;
if(!vis[dx][dy][dx_][dy_]) {
vis[dx][dy][dx_][dy_] = 1;
q.push({dx, dy, dx_, dy_});
pre[dx][dy][dx_][dy_] = {x, y, x_, y_};
ans[dx][dy][dx_][dy_] = 'D';
step[dx][dy][dx_][dy_] = step[x][y][x_][y_] + 1;
}
}
void left(int x, int y, int x_, int y_) {
int dx = x, dy = y, dx_ = x_, dy_ = y_;
if(s1[x][y - 1] == '.') dy--;
if(s2[x_][y_ + 1] == '.') dy_++;
if(!vis[dx][dy][dx_][dy_]) {
vis[dx][dy][dx_][dy_] = 1;
q.push({dx, dy, dx_, dy_});
pre[dx][dy][dx_][dy_] = {x, y, x_, y_};
ans[dx][dy][dx_][dy_] = 'L';
step[dx][dy][dx_][dy_] = step[x][y][x_][y_] + 1;
}
}
void right(int x, int y, int x_, int y_) {
int dx = x, dy = y, dx_ = x_, dy_ = y_;
if(s1[x][y + 1] == '.') dy++;
if(s2[x_][y_ - 1] == '.') dy_--;
if(!vis[dx][dy][dx_][dy_]) {
vis[dx][dy][dx_][dy_] = 1;
q.push({dx, dy, dx_, dy_});
pre[dx][dy][dx_][dy_] = {x, y, x_, y_};
ans[dx][dy][dx_][dy_] = 'R';
step[dx][dy][dx_][dy_] = step[x][y][x_][y_] + 1;
}
}
void up(int x, int y, int x_, int y_) {
int dx = x, dy = y, dx_ = x_, dy_ = y_;
if(s1[x - 1][y] == '.') dx--;
if(s2[x_ - 1][y_] == '.') dx_--;
if(!vis[dx][dy][dx_][dy_]) {
vis[dx][dy][dx_][dy_] = 1;
q.push({dx, dy, dx_, dy_});
pre[dx][dy][dx_][dy_] = {x, y, x_, y_};
ans[dx][dy][dx_][dy_] = 'U';
step[dx][dy][dx_][dy_] = step[x][y][x_][y_] + 1;
}
}
signed main() {
freopen("maze.in","r",stdin);
freopen("maze.out","w",stdout);
int qwq;
scanf("%d",&qwq);
for(int i = 1; i <= 20; i++) {
scanf("%s", s1[i] + 1);
scanf("%s", s2[i] + 1);
}
vis[20][20][20][1] = 1;
q.push({20, 20, 20, 1});
while(!q.empty()) {
array<int,4>u = q.front();
q.pop();
// if(step[u[0]][u[1]][u[2]][u[3]] > 26 && u[0] == 1 && u[2] == 1) cout << u[0] << ' ' << u[1] << ' ' << u[2] << ' ' << u[3] << ' ' << step[u[0]][u[1]][u[2]][u[3]] << "\n";
if(u[0] == 1 && u[1] == 20 && u[2] == 1 && u[3] == 1) {
break;
}
down(u[0], u[1], u[2], u[3]);
left(u[0], u[1], u[2], u[3]);
right(u[0], u[1], u[2], u[3]);
up(u[0], u[1], u[2], u[3]);
}
array<int,4> u = {1, 20, 1, 1};
array<int,4> st = {20, 20, 20, 1};
while(u != st) {
rec.push_back(ans[u[0]][u[1]][u[2]][u[3]]);
s1[u[0]][u[1]] = 'A';
s2[u[2]][u[3]] = 'A';
u = pre[u[0]][u[1]][u[2]][u[3]];
}
s1[20][20] = s2[20][1] = 'A';
cout << rec.size() << "\n";
if(qwq == 1) return 0;
reverse(rec.begin(), rec.end());
for(auto i : rec) cout << i;
puts("");
for(int i = 1; i <= 20; i++) {
cout << s1[i] + 1 << ' ' << s2[i] + 1 << '\n';
}
}
5045

被折叠的 条评论
为什么被折叠?



