OJ求序列的第N项改错问题描述给定程序中函数fun的功能是根据整型形参n计算如下公式的值。例如若 n10则应输出0.617977。请改正程序中的语法错误使它能得出正确的结果。注意不要改动 main 函数不得增行或删行也不得更改程序的结构#include stdio.h/************found************/int fun (int n) {float A 1;int i;/************found************/for (i 2; i n; i)A 1 / (1 A);return A ;}int main() {int n ;scanf(%d, n);printf(A%d%f, n, fun(n));return 0;}输入说明输入一个正整数n输出说明根据源程序所给格式进行输出输入范例10输出范例A100.617977代码#include stdio.h /************found************/ double fun (int n) { float A 1; int i; /************found************/ for (i 2; in; i) A 1 / (1 A); return A ; } int main() { int n ; scanf(%d, n); printf(A%d%f, n, fun(n)); return 0; }数组值对换填空问题描述将数组中的前半部分元素中的值和后半部分元素中的值对换。若数组中元素的个数n为奇数则中间的元素不动。例如若a数组中的数据依次为1、2、3、4、5、6、7、8、9则调换后为6、7、8、9、5、1、2、3、4。请在程序的下划线处填入正确的内容并把下划线删除使程序得出正确的结果。注意源程序存如下。不得增行或删行也不得更改程序的结构#include stdio.h#define N 100int main(){int n;int a[N], i, t, p;scanf(%d, n);for (i 0; i n; i)scanf(%d, a[i]);/**********found**********/p (n % 2 0) ? n / 2 : n / 2 ___1___;for (i 0; i n / 2; i){t a[i];/**********found**********/a[i] a[p ___2___];/**********found**********/___3___ t;}for (i 0; i n; i)printf(%4d , a[i]);return 0;}输入说明首先输入一个正整数n然后输入n个正整数输出说明根据源程序所给格式进行输出输入范例91 2 3 4 5 6 7 8 9输出范例6 7 8 9 5 1 2 3 4代码#include stdio.h #define N 100 int main() { int n; int a[N], i, t, p; scanf(%d, n); for (i 0; i n; i) scanf(%d, a[i]); /**********found**********/ p (n % 2 0) ? n / 2 : n / 2 1; for (i 0; i n / 2; i) { t a[i]; /**********found**********/ a[i] a[p i]; /**********found**********/ a[pi] t; } for (i 0; i n; i) printf(%4d , a[i]); return 0; }地铁门问题描述明明坐地铁久了掌握了规律发现地铁一般有8节车厢每节车厢共有5个门其中第1和第5个门靠近两端。从第1节到第8节车厢地铁门的编号从1到40。此外明明还发现编号5的门和编号6的门靠近车厢连接处即第1节和第2节车厢的连接部位站在这种地方摇晃得更厉害因此他每次都避免从任何靠近车厢连接处的地方上车除了编号5和6还有别的门也靠近车厢连接处。注意第1个门和第40个门是地铁两头的门不靠近车厢连接处。现在需要输入一个门的编号你要告诉明明是否靠近车厢连接处从而他能选择是否从该门上车。输入说明输入一个整数表示门的编号输出说明如果门靠近车厢连接处输出“Y”如果不靠近车厢连接处输出“N”如果门的编号有误不在1到40之间输出“error”所有输出不包括引号也不包含空格。输入范例5输出范例Y代码#includebits/stdc.h using namespace std; int main() { int n; cinn; if(n1n40) { if(n1||n40) coutN; else if(n%50) coutY; else if(n%51) coutY; else coutN; } else couterror; return 0; }暗恋问题描述同在一个高中他却不敢去找她虽然在别人看来那是再简单不过的事。暗恋是他唯一能做的事。他只能在每天课间操的时候望望她的位置看看她倾心的动作就够了。操场上的彩砖啊你们的位置就是他们能够站立的地方他俩的关系就像砖与砖之间一样固定无法动摇。还记得当初铺砖的工人将整个操场按正方形铺砖整个操场可视为R行C列的矩阵矩阵的每个元素为一块正方形砖块正方形砖块有两种一种为蓝色另一种为红色。我们定义他和她之间的“爱情指标”为最大纯色正方形的面积请你写一个程序求出“爱情指标”。输入说明第一行两个正整数R和CR和C都不超过200。接下来R行C列描述整个操场红色砖块用1来表示蓝色砖块用0来表示。输出说明一个数表示他和她之间的“爱情指标”。输入范例5 80 0 0 1 1 1 0 11 1 0 1 1 1 1 10 1 1 1 1 1 0 11 0 1 1 1 1 1 01 1 1 0 1 1 0 1输出范例9代码#includebits/stdc.h using namespace std; #define MAX 1005 int p[MAX][MAX]; //以ab为左上角ans为边长的正方形是否为纯色 int check(int a,int b,int ans){ int tempp[a][b]; for(int i0;ians;i) for(int j0;jans;j){ if(p[ai][bj]!temp)return 0; } return 1; } int main(void){ int R,C; cinRC; int mmaxRC?R:C;// int ans0; for(int i0;iR;i) for(int j0;jC;j) cinp[i][j]; for(int i0;iR;i) for(int j0;jC;j) for(int kans1;kmmax;k){ if(ikRjkC) if(check(i,j,k)) ansk; else break; } coutans*ans; return 0; }多级排序问题描述本学期大家学习了C语言程序设计现在需要你实现一个成绩排名系统。假设他们每个人都有三门课程C语言程序设计、计算机导论和英语要求把成绩好的同学放到前面。具体要求是先按个人的总成绩进行排名如果某两个人的总分相同则按他们的C语言程序设计成绩进行排名如果总成绩和C语言程序设计成绩都相同时则再按照他们的计算机导论成绩进行排名输入的数据保证这两个人的计算机导论成绩不会再相同。try to do it ^_^输入说明输入多组数据。每组数据的第一行为学生的数目NN100接下来的N行每行输入一个学生的信息包括学生姓名长度小于20、C语言程序设计成绩0到100的整数、计算机导论成绩0到100的整数和英语成绩0到100的整数。每两个数据之间有一个空格学生姓名中不包含空格。输出说明对于每组输入输出按照成绩从高到低排序的姓名、总分、C语言程序设计、计算机导论和英语成绩序列每个学生占一行。我们保证不会存在两个人总成绩和各门的成绩都分别相同的情况。两组输出数据之间有一个空行第一组数据前面及最后一组数据后面无空行。输入范例3Henry 98 95 90Marry 90 88 89Jhon 92 90 953zhangsan 90 90 90lisi 85 95 90wangwu 85 90 95输出范例Henry 283 98 95 90Jhon 277 92 90 95Marry 267 90 88 89zhangsan 270 90 90 90lisi 270 85 95 90wangwu 270 85 90 95代码#includebits/stdc.h using namespace std; struct Student{ string name; int C_score; int computer_score; int english; int sum; }; bool cmp(Student a,Student b) { if(a.sum!b.sum) return a.sumb.sum; else { if(a.C_score!b.C_score) return a.C_scoreb.C_score; else { if(a.computer_score!b.computer_score) return a.computer_scoreb.computer_score; } } } int main() { int N; bool firsttrue; while(cinN) { Student stu[N]; for(int i0;iN;i) { cinstu[i].namestu[i].C_scorestu[i].computer_scorestu[i].english; } for(int i0;iN;i) { stu[i].sumstu[i].computer_scorestu[i].C_scorestu[i].english; } sort(stu,stuN,cmp); if(!first) coutendl; firstfalse; for(int i0;iN;i) { coutstu[i].name stu[i].sum stu[i].C_score stu[i].computer_score stu[i].englishendl; } } return 0; }木棍还原问题描述小明有一些相同长度的木棍他将它们随机切割直到所有切割后的短棍长度不超过50。现在他想把棍子恢复到原来的状态但他忘了他原来有多少根棍子但知道至少有两根也不知道它们原来有多长。请帮助他设计一个程序计算出这些棍子的最小原始长度。输入说明输入包含多组数据每组数据包含2行。第一行包含切割后的短棍的数量nn64。第二行包含这些短棍的长度由空格分隔。所有长度值都是大于0的整数。最后一组数据之后是一个0表示输入结束。输出说明为每组数据输出一行包括一个整数表示棍子原始的长度。如果原始长度有多种可能则输出最小的那个。输入范例72 7 7 7 7 10 2061 2 3 11 11 200输出范例3024代码错误版#includebits/stdc.h using namespace std; //木棍长度相同 int main() { int n; while(cinn) { if(n0) return 0; int len[n]; for(int i0;in;i) cinlen[i]; int sum0; for(int i0;in;i) { sumlen[i]; } int temp[n]; for(int i0;in;i) { temp[i]len[i]; } sort(temp,tempn); int xtemp[n-1]; int min-1; for(int i2;;i) { if(sum%i0sum/ix) { if(minsum/i) minsum/i; break; } } coutminendl; } return 0; }深度优先搜索#includebits/stdc.h using namespace std; int n; vectorint a; bool used[70]; // 当前正在拼一根长度为 len 的木棍已经拼了 now已经拼好 cnt 根 bool dfs(int len, int now, int cnt) { // 全部拼完 if (cnt n) return true; for (int i 0; i n; i) { if (used[i]) continue; // 加上这根不超过长度 if (now a[i] len) { used[i] true; // 刚好拼完一根开始拼下一根 if (now a[i] len) { if (dfs(len, 0, cnt 1)) return true; } else { // 继续拼当前这根 if (dfs(len, now a[i], cnt 1)) return true; } used[i] false; } } return false; } int main() { while (cin n n ! 0) { a.resize(n); int sum 0, maxLen 0; for (int i 0; i n; i) { cin a[i]; sum a[i]; maxLen max(maxLen, a[i]); } // 从小到大试每一个可能的原始长度 int ans 0; for (int len maxLen; len sum / 2; len) { if (sum % len ! 0) continue; // 必须能整除 memset(used, 0, sizeof(used)); if (dfs(len, 0, 0)) { ans len; break; } } cout ans endl; } return 0; }天天向上问题描述A同学的学习成绩十分不稳定于是老师对他说“只要你连续4天成绩有进步那我就奖励给你一朵小红花。”可是这对于A同学太困难了。于是老师对他放宽了要求“只要你有4天成绩是递增的我就奖励你一朵小红花。”即只要对于第i、j、k、l四天满足ijkl并且对于成绩wiwjwkwl那么就可以得到一朵小红花的奖励。现让你求出A同学可以得到多少朵小红花。输入说明第一行一个整数n表示总共有n天。第二行n个数表示每天的成绩wi。n10000wi109。输出说明一个整数表示总共可以得到多少朵小红花。输入范例61 3 2 3 4 5输出范例6个人总结找到长度为4的所有递增子序列dp1[i] 以w[i]结尾的长度为 1 的递增子序列的数量其实就是 1。dp2[i] 以w[i]结尾的长度为 2 的递增子序列的数量。dp3[i] 以w[i]结尾的长度为 3 的递增子序列的数量。dp4[i] 以w[i]结尾的长度为 4 的递增子序列的数量。代码#include iostream #include vector using namespace std; int main() { int n; cin n; vectorlong long w(n 1); // 成绩数组从1开始索引 for (int i 1; i n; i) { cin w[i]; } // dp1[i]: 以第i天结尾的长度为1的递增子序列个数恒为1 // dp2[i]: 以第i天结尾的长度为2的递增子序列个数 // dp3[i]: 以第i天结尾的长度为3的递增子序列个数 // dp4[i]: 以第i天结尾的长度为4的递增子序列个数 vectorlong long dp1(n 1, 0); vectorlong long dp2(n 1, 0); vectorlong long dp3(n 1, 0); vectorlong long dp4(n 1, 0); for (int i 1; i n; i) { dp1[i] 1; // 每个元素自身构成长度为1的递增子序列 for (int j 1; j i; j) { if (w[j] w[i]) { // 所有以j结尾的长度为1的子序列加上w[i]后变为长度为2 dp2[i] dp1[j]; // 所有以j结尾的长度为2的子序列加上w[i]后变为长度为3 dp3[i] dp2[j]; // 所有以j结尾的长度为3的子序列加上w[i]后变为长度为4 dp4[i] dp3[j]; } } } // 统计所有长度为4的递增子序列 long long total 0; for (int i 1; i n; i) { total dp4[i]; } cout total endl; return 0; }英语
3月27日 模拟题
发布时间:2026/5/19 2:23:26
OJ求序列的第N项改错问题描述给定程序中函数fun的功能是根据整型形参n计算如下公式的值。例如若 n10则应输出0.617977。请改正程序中的语法错误使它能得出正确的结果。注意不要改动 main 函数不得增行或删行也不得更改程序的结构#include stdio.h/************found************/int fun (int n) {float A 1;int i;/************found************/for (i 2; i n; i)A 1 / (1 A);return A ;}int main() {int n ;scanf(%d, n);printf(A%d%f, n, fun(n));return 0;}输入说明输入一个正整数n输出说明根据源程序所给格式进行输出输入范例10输出范例A100.617977代码#include stdio.h /************found************/ double fun (int n) { float A 1; int i; /************found************/ for (i 2; in; i) A 1 / (1 A); return A ; } int main() { int n ; scanf(%d, n); printf(A%d%f, n, fun(n)); return 0; }数组值对换填空问题描述将数组中的前半部分元素中的值和后半部分元素中的值对换。若数组中元素的个数n为奇数则中间的元素不动。例如若a数组中的数据依次为1、2、3、4、5、6、7、8、9则调换后为6、7、8、9、5、1、2、3、4。请在程序的下划线处填入正确的内容并把下划线删除使程序得出正确的结果。注意源程序存如下。不得增行或删行也不得更改程序的结构#include stdio.h#define N 100int main(){int n;int a[N], i, t, p;scanf(%d, n);for (i 0; i n; i)scanf(%d, a[i]);/**********found**********/p (n % 2 0) ? n / 2 : n / 2 ___1___;for (i 0; i n / 2; i){t a[i];/**********found**********/a[i] a[p ___2___];/**********found**********/___3___ t;}for (i 0; i n; i)printf(%4d , a[i]);return 0;}输入说明首先输入一个正整数n然后输入n个正整数输出说明根据源程序所给格式进行输出输入范例91 2 3 4 5 6 7 8 9输出范例6 7 8 9 5 1 2 3 4代码#include stdio.h #define N 100 int main() { int n; int a[N], i, t, p; scanf(%d, n); for (i 0; i n; i) scanf(%d, a[i]); /**********found**********/ p (n % 2 0) ? n / 2 : n / 2 1; for (i 0; i n / 2; i) { t a[i]; /**********found**********/ a[i] a[p i]; /**********found**********/ a[pi] t; } for (i 0; i n; i) printf(%4d , a[i]); return 0; }地铁门问题描述明明坐地铁久了掌握了规律发现地铁一般有8节车厢每节车厢共有5个门其中第1和第5个门靠近两端。从第1节到第8节车厢地铁门的编号从1到40。此外明明还发现编号5的门和编号6的门靠近车厢连接处即第1节和第2节车厢的连接部位站在这种地方摇晃得更厉害因此他每次都避免从任何靠近车厢连接处的地方上车除了编号5和6还有别的门也靠近车厢连接处。注意第1个门和第40个门是地铁两头的门不靠近车厢连接处。现在需要输入一个门的编号你要告诉明明是否靠近车厢连接处从而他能选择是否从该门上车。输入说明输入一个整数表示门的编号输出说明如果门靠近车厢连接处输出“Y”如果不靠近车厢连接处输出“N”如果门的编号有误不在1到40之间输出“error”所有输出不包括引号也不包含空格。输入范例5输出范例Y代码#includebits/stdc.h using namespace std; int main() { int n; cinn; if(n1n40) { if(n1||n40) coutN; else if(n%50) coutY; else if(n%51) coutY; else coutN; } else couterror; return 0; }暗恋问题描述同在一个高中他却不敢去找她虽然在别人看来那是再简单不过的事。暗恋是他唯一能做的事。他只能在每天课间操的时候望望她的位置看看她倾心的动作就够了。操场上的彩砖啊你们的位置就是他们能够站立的地方他俩的关系就像砖与砖之间一样固定无法动摇。还记得当初铺砖的工人将整个操场按正方形铺砖整个操场可视为R行C列的矩阵矩阵的每个元素为一块正方形砖块正方形砖块有两种一种为蓝色另一种为红色。我们定义他和她之间的“爱情指标”为最大纯色正方形的面积请你写一个程序求出“爱情指标”。输入说明第一行两个正整数R和CR和C都不超过200。接下来R行C列描述整个操场红色砖块用1来表示蓝色砖块用0来表示。输出说明一个数表示他和她之间的“爱情指标”。输入范例5 80 0 0 1 1 1 0 11 1 0 1 1 1 1 10 1 1 1 1 1 0 11 0 1 1 1 1 1 01 1 1 0 1 1 0 1输出范例9代码#includebits/stdc.h using namespace std; #define MAX 1005 int p[MAX][MAX]; //以ab为左上角ans为边长的正方形是否为纯色 int check(int a,int b,int ans){ int tempp[a][b]; for(int i0;ians;i) for(int j0;jans;j){ if(p[ai][bj]!temp)return 0; } return 1; } int main(void){ int R,C; cinRC; int mmaxRC?R:C;// int ans0; for(int i0;iR;i) for(int j0;jC;j) cinp[i][j]; for(int i0;iR;i) for(int j0;jC;j) for(int kans1;kmmax;k){ if(ikRjkC) if(check(i,j,k)) ansk; else break; } coutans*ans; return 0; }多级排序问题描述本学期大家学习了C语言程序设计现在需要你实现一个成绩排名系统。假设他们每个人都有三门课程C语言程序设计、计算机导论和英语要求把成绩好的同学放到前面。具体要求是先按个人的总成绩进行排名如果某两个人的总分相同则按他们的C语言程序设计成绩进行排名如果总成绩和C语言程序设计成绩都相同时则再按照他们的计算机导论成绩进行排名输入的数据保证这两个人的计算机导论成绩不会再相同。try to do it ^_^输入说明输入多组数据。每组数据的第一行为学生的数目NN100接下来的N行每行输入一个学生的信息包括学生姓名长度小于20、C语言程序设计成绩0到100的整数、计算机导论成绩0到100的整数和英语成绩0到100的整数。每两个数据之间有一个空格学生姓名中不包含空格。输出说明对于每组输入输出按照成绩从高到低排序的姓名、总分、C语言程序设计、计算机导论和英语成绩序列每个学生占一行。我们保证不会存在两个人总成绩和各门的成绩都分别相同的情况。两组输出数据之间有一个空行第一组数据前面及最后一组数据后面无空行。输入范例3Henry 98 95 90Marry 90 88 89Jhon 92 90 953zhangsan 90 90 90lisi 85 95 90wangwu 85 90 95输出范例Henry 283 98 95 90Jhon 277 92 90 95Marry 267 90 88 89zhangsan 270 90 90 90lisi 270 85 95 90wangwu 270 85 90 95代码#includebits/stdc.h using namespace std; struct Student{ string name; int C_score; int computer_score; int english; int sum; }; bool cmp(Student a,Student b) { if(a.sum!b.sum) return a.sumb.sum; else { if(a.C_score!b.C_score) return a.C_scoreb.C_score; else { if(a.computer_score!b.computer_score) return a.computer_scoreb.computer_score; } } } int main() { int N; bool firsttrue; while(cinN) { Student stu[N]; for(int i0;iN;i) { cinstu[i].namestu[i].C_scorestu[i].computer_scorestu[i].english; } for(int i0;iN;i) { stu[i].sumstu[i].computer_scorestu[i].C_scorestu[i].english; } sort(stu,stuN,cmp); if(!first) coutendl; firstfalse; for(int i0;iN;i) { coutstu[i].name stu[i].sum stu[i].C_score stu[i].computer_score stu[i].englishendl; } } return 0; }木棍还原问题描述小明有一些相同长度的木棍他将它们随机切割直到所有切割后的短棍长度不超过50。现在他想把棍子恢复到原来的状态但他忘了他原来有多少根棍子但知道至少有两根也不知道它们原来有多长。请帮助他设计一个程序计算出这些棍子的最小原始长度。输入说明输入包含多组数据每组数据包含2行。第一行包含切割后的短棍的数量nn64。第二行包含这些短棍的长度由空格分隔。所有长度值都是大于0的整数。最后一组数据之后是一个0表示输入结束。输出说明为每组数据输出一行包括一个整数表示棍子原始的长度。如果原始长度有多种可能则输出最小的那个。输入范例72 7 7 7 7 10 2061 2 3 11 11 200输出范例3024代码错误版#includebits/stdc.h using namespace std; //木棍长度相同 int main() { int n; while(cinn) { if(n0) return 0; int len[n]; for(int i0;in;i) cinlen[i]; int sum0; for(int i0;in;i) { sumlen[i]; } int temp[n]; for(int i0;in;i) { temp[i]len[i]; } sort(temp,tempn); int xtemp[n-1]; int min-1; for(int i2;;i) { if(sum%i0sum/ix) { if(minsum/i) minsum/i; break; } } coutminendl; } return 0; }深度优先搜索#includebits/stdc.h using namespace std; int n; vectorint a; bool used[70]; // 当前正在拼一根长度为 len 的木棍已经拼了 now已经拼好 cnt 根 bool dfs(int len, int now, int cnt) { // 全部拼完 if (cnt n) return true; for (int i 0; i n; i) { if (used[i]) continue; // 加上这根不超过长度 if (now a[i] len) { used[i] true; // 刚好拼完一根开始拼下一根 if (now a[i] len) { if (dfs(len, 0, cnt 1)) return true; } else { // 继续拼当前这根 if (dfs(len, now a[i], cnt 1)) return true; } used[i] false; } } return false; } int main() { while (cin n n ! 0) { a.resize(n); int sum 0, maxLen 0; for (int i 0; i n; i) { cin a[i]; sum a[i]; maxLen max(maxLen, a[i]); } // 从小到大试每一个可能的原始长度 int ans 0; for (int len maxLen; len sum / 2; len) { if (sum % len ! 0) continue; // 必须能整除 memset(used, 0, sizeof(used)); if (dfs(len, 0, 0)) { ans len; break; } } cout ans endl; } return 0; }天天向上问题描述A同学的学习成绩十分不稳定于是老师对他说“只要你连续4天成绩有进步那我就奖励给你一朵小红花。”可是这对于A同学太困难了。于是老师对他放宽了要求“只要你有4天成绩是递增的我就奖励你一朵小红花。”即只要对于第i、j、k、l四天满足ijkl并且对于成绩wiwjwkwl那么就可以得到一朵小红花的奖励。现让你求出A同学可以得到多少朵小红花。输入说明第一行一个整数n表示总共有n天。第二行n个数表示每天的成绩wi。n10000wi109。输出说明一个整数表示总共可以得到多少朵小红花。输入范例61 3 2 3 4 5输出范例6个人总结找到长度为4的所有递增子序列dp1[i] 以w[i]结尾的长度为 1 的递增子序列的数量其实就是 1。dp2[i] 以w[i]结尾的长度为 2 的递增子序列的数量。dp3[i] 以w[i]结尾的长度为 3 的递增子序列的数量。dp4[i] 以w[i]结尾的长度为 4 的递增子序列的数量。代码#include iostream #include vector using namespace std; int main() { int n; cin n; vectorlong long w(n 1); // 成绩数组从1开始索引 for (int i 1; i n; i) { cin w[i]; } // dp1[i]: 以第i天结尾的长度为1的递增子序列个数恒为1 // dp2[i]: 以第i天结尾的长度为2的递增子序列个数 // dp3[i]: 以第i天结尾的长度为3的递增子序列个数 // dp4[i]: 以第i天结尾的长度为4的递增子序列个数 vectorlong long dp1(n 1, 0); vectorlong long dp2(n 1, 0); vectorlong long dp3(n 1, 0); vectorlong long dp4(n 1, 0); for (int i 1; i n; i) { dp1[i] 1; // 每个元素自身构成长度为1的递增子序列 for (int j 1; j i; j) { if (w[j] w[i]) { // 所有以j结尾的长度为1的子序列加上w[i]后变为长度为2 dp2[i] dp1[j]; // 所有以j结尾的长度为2的子序列加上w[i]后变为长度为3 dp3[i] dp2[j]; // 所有以j结尾的长度为3的子序列加上w[i]后变为长度为4 dp4[i] dp3[j]; } } } // 统计所有长度为4的递增子序列 long long total 0; for (int i 1; i n; i) { total dp4[i]; } cout total endl; return 0; }英语