选择题 共15道
阅读程序 共18道
完善程序 共10道
int calc(int n) { if(n<= 1) return 1; if(n%2==0) return calc(n/2)+ 1; else return calc(n-1)+calc(n-2); }
void solve(int &a, int b) { a = a + b; b = a - b; a = a - b; } int main() { int x = 5, y = 10; solve(x, y); }
二、阅读程序(程序输入不超过数组或字符串定义的范围;判断题正确填√,错误填x;除特殊说明外,判断题1.5分,选择题3分,共计40分)
01 #include <algorithm> 02 #include <cstdio> 03 #include <cstring> 04 inline int gcd(int a, int b) { 05 if(b == 0) 06 return a; 07 return gcd(b, a % b); 08 } 09 int main() { 10 int n; 11 scanf("%d", &n); 12 int ans = 0; 13 for(int i=1; i<=n; ++i) { 14 for(int j=i+1; j<=n; ++j) { 15 for(int k=j+1; k<=n; ++k) { 16 if(gcd(i,j)==1 && gcd(j,k)==1 && gcd(i,k)==1) { 17 ++ans; 18 } 19 } 20 } 21 } 22 printf("%d\n",ans); 23 return 0; 24 }
01 #include <algorithm> 02 #include <cstdio> 03 #include <cstring> 04 #define ll long long 05 int n, k; 06 int a[200007]; 07 int ans[200007]; 08 int main() { 09 scanf("%d%d",&n,&k); 10 for(int i=1; i<=n; ++i) { 11 scanf("%d", &a[i]); 12 } 13 std::sort(a+1, a+n+1); 14 n = std::unique(a+1, a+n+1)-a-1; 15 for(int i=1,j=0; i<=n; ++i) { 16 for(; j<i && a[i]-a[j+1]>k; ++j) 17 ; 18 ans[i]= ans[j]+1; 19 } 20 printf("%d\n", ans[n]); 21 return 0; 22 }
01 #include <algorithm> 02 #include <cstdio> 03 #include<cstring> 04 #define ll long long 05 int f[5007][5007]; 06 int a[5007],b[5007]; 07 int n; 08 int main() { 09 scanf("%d",&n); 10 for(int i=1; i<=n; ++i) { 11 scanf("%d",&a[i]); 12 } 13 for(int i=1; i<=n; ++i) { 14 scanf("%d",&b[i]); 15 } 16 for(int i=1; i<=n; ++i) { 17 for(int j=1; j<=n; ++j) { 18 f[i][j] = std::max(f[i][j],std::max(f[i-1][j],f[i][j-1])); 19 if(a[i] == b[j]) { 20 f[i][j]=std::max(f[i][j],f[i-1][j- 1]+ 1); 21 } 22 } 23 } 24 printf("%d\n",f[n][n]); 25 return 0; 26 }
(字符串解码)“行程长度编码”(Run-Length Encoding)是一种无损压缩算法,常用于压缩重复字符较多的数据,以减少存储空间。假设原始字符串不包含数字字符。压缩规则如下:i)如果原始字符串中一个字符连续出现N次(N≥2),在压缩字符串中它被表示为“字符+数字 N”。例如,编码“A12”代表12个连续的字符A。ii)如果原始字符串中一个字符只出现1次,在压缩字符串中它就表示为该字符本身。例如,编码“B”代表1个字符 B。
以下程序实现读取压缩字符串并输出其原始的、解压后的形式。试补全程序。
01 #include <cctype> 02 #include <iostream> 03 #include <string> 04 using namespace std; 05 06 int main() { 07 string z; 08 cin >> z; 09 string s=""; 10 11 for(int i=0; i<z.length();) { 12 char ch = z[i]; 13 14 if(__①__ && isdigit(z[i+1])) { 15 i++; 16 int count = 0; 17 while(i<z.length() && isdigit(z[i])) { 18 count = __②__; 19 i++; 20 } 21 for(int j=0; j< __③__ ; ++j) { 22 s += ch; 23 } 24 } else { 25 s += __④__; 26 __⑤__; 27 } 28 } 29 30 cout<<s<<endl; 31 return 0; 32 }
(精明与糊涂)有N个人,分为两类:i)精明人:永远能正确判断其他人是精明还是糊涂;ii)糊涂人:判断不可靠,会给出随机的判断。已知精明人严格占据多数,即如果精明人有 k 则满足 k > N/2。
你只能通过函数 query(i, j)让第i个人判断第j个人:返回 true 表示判断结果为“精明人”;返回 false 表示判断结果为“糊涂人”。你的目标是,通过这些互相判断,找出至少一个百分之百能确定的精明人。同时,你无需关心 query(i, j)的内部实现。
以下程序利用“精明人占多数”的优势。设想一个“消除”的过程,让人们互相判断并进行抵消。经过若干轮抵消后,最终留下的候选者必然属于多数派,即精明人。
例如,假设有三个人 0、1、2。如果0说1是糊涂人,而1也说0是糊涂人,则0和1至少有一个是糊涂人。程序将同时淘汰0和1。由于三人里至少有两个精明人,我们确定2是精明人。
试补全程序。
01 #include <iostream> 02 #include <vector> 03 using namespace std; 04 05 int N; 06 bool query(int i, int j); 07 08 int main() { 09 cin >> N; 10 11 int candidate = 0; 12 int count = __①__; 13 14 for(int i=1; i<N; ++i) { 15 if (__②__) { 16 candidate = i; 17 count = 1; 18 } else { 19 if(__③__) { 20 __④__ 21 } else { 22 count++; 23 } 24 } 25 } 26 27 cout<<__⑤__<<endl; 28 return 0; 29 }