选择题 共15道
阅读程序 共17道
完善程序 共10道
01 #include< bits/stdc++.h> 02 using namespace std; 03 04 using i64=long long; 05 06 int popcount(i64 x) 07 { 08 int res = 0; 09 while(x) 10 { 11 if(x & 1 == 1) 12 res++; 13 x >>= 1; 14 } 15 return res; 16 } 17 18 int calc(i64 x) 19 { 20 int sum = 0; 21 for(i64 i = 1; i <= x; i++) 22 sum += popcount(i); 23 return sum; 24 } 25 26 int sum(i64 l, i64 r) 27 { 28 return calc(r) - calc(l); 29 } 30 31 int main() 32 { 33 i64 l, r; 34 cin >> l >> r; 35 cout << calc(l) << ' ' << sum(l, r) << endl; 36 return 0; 37 }
若程序输入为 5 8,则程序输出 7 6。 ( )
01 #include < bits/stdc++.h> 02 using namespace std; 03 04 const int inf = 0x3f3f3f3f; 05 06 int solve(vector &cur) 07 { 08 int n = cur.size(); 09 vector> dp(n + 1, vector(n + 1, inf)); 10 for(int i = 0; i <= n; i++) 11 dp[0][i] = dp[i][0] = 0; 12 for(int i = 1; i <= n; i++) 13 dp[i][i] = cur[i - 1]; 14 for(int i = 1; i <= n; i++) 15 for(int j = 1; j <= n; j++) 16 if(i != j) 17 dp[i][j]=min(dp[i][j],dp[i-1][j]+dp[i][j-1]); 18 int ans = 0; 19 for(int i = 1; i <= n; i++) 20 ans = max(ans, dp[n][i]); 21 return ans; 22 } 23 24 int main() 25 { 26 int n; 27 cin >> n; 28 vector cost(n); 29 for(int i=0;i< n;i++) 30 cin>>cost[i]; 31 cout<< solve(cost)<< endl; 32 return 0; 33 }
若输入为3 1 2 3,则输出为3。
假设输入均为非负数,完成下面的问题
01 #include < bits/stdc++.h> 02 using namespace std; 03 04 int func(int a,int b) 05 { 06 if(a==0) 07 return b; 08 if(b==0) 09 return a; 10 return a+func(b,a%b); 11 } 12 13 int main() 14 { 15 int x,y; 16 cin>> x>> y; 17 cout<< func(x,y)<< endl; 18 return 0; 19 }
当输入为2 3时,程序的输出为5。
给定一个整数数组colors和一个整数k,其中colors表示一个由红色瓷砖和蓝色瓷砖组成的环,第 i 块瓷砖的颜色为 colors[i] (1 代表红色,0 代表蓝色)。环中连续 k 块瓷砖的颜色如果是交替颜色(除了第一块和最后一块瓷砖以外,中间瓷砖的颜色与它左边瓷砖和右边瓷砖的颜色都不同),那么它被称为一个交替组。现在,请你找出交替组的个数。
01 #include < iostream> 02 #include <①> 03 04 using namespace std; 05 06 int main() 07 { 08 int n, k; 09 cin >> n >> k; 10 vector colors(n); 11 for(int i = 0; i < n; i++) 12 cin >> colors[i]; 13 int ans = 0, cnt = ②; 14 for(int i = 0; i < ③; i++) 15 { 16 if(i > 0 && ④) 17 cnt = 0; 18 cnt++; 19 ans += (⑤ && cnt >= k); 20 } 21 cout << ans << endl; 22 return 0; 23 }
①处应填( )。
在国际象棋中,马的一次移动定义为:垂直移动两个方格后再水平移动一个方格,或者水平移动两个方格后再垂直移动一个方格(两者都形成一个L的形状)。 现在,我们有一个马和一个电话垫(如下所示),马只能站在数字单元格上。你可以将马放置在任何数字单元格上,然后你应该执行n-1次移动来获得长度为n的号码。马所有的移动应该是符合规则的有效的移动。马在一次移动的过程中可以经过符号单元格,但必须保证这次移动结束后马站在数字单元格上。 给定一个整数n,请你计算可以得到多少个长度为n的数字串。由于答案可能很大,请你输出答案对 109+7 取模后的结果。
01 #include < iostream> 02 #include < vector> 03 04 using namespace std; 05 06 const int mod = 1E9 + 7; 07 vector< vector< int>> pos = {{4, 6}, {6, 8}, {7, 9}, {4, 8}, {0, 3, 9},①,{0,1,7},{2,6},{1,3},{2,4}}; 08 09 int main() 10 { 11 int n; 12 cin >> n; 13 vector< vector< int>> dp(10, vector< int>(n + 1, 0)); 14 for(int i = 0; i < 10; i++) 15 ② = 1; 16 for(int j = 2; j <= n; j++) 17 { 18 for(int i = 0; i < 10; i++) 19 { 20 for(int k = 0; k < pos[i].size(); k++) 21 { 22 dp[i][j] += dp[③][j - 1]; 23 ④; 24 } 25 } 26 } 27 int ans = 0; 28 for(int i = 0; i < 10; i++) 29 { 30 ⑤; 31 ans %= mod; 32 } 33 cout << ans << endl; 34 return 0; 35 }