A.
水题。。。代码如下:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<cmath> #include<cstdio> #include<queue> using namespace std ; char s[11111] ; void init() { int t ; scanf("%d" , &t) ; int n ; cin >> n ; scanf("%s" , s) ; int len = strlen(s) ; int i ; cout << t <<" " ; for(i = 0 ; i < len ; i ++) { int j ; for(j = 0 ; j < n ; j ++) { printf("%c" , s[i]) ; } } puts("") ; } int main() { int T ; cin >> T ; while (T --) { init() ; } return 0 ; }
B.
找规律题,找出的规律是:第n行(n 从 0 开始)第一个数字是1,第二个数字是n , 第三个数字是n + (n - 3) ,第四个数字是n + (n - 5) , 第五个数字是n - (n - 7) ,这个过程中要保证(n - x) > 0 (其中 x 为 3, 5 ,7 …… )。这计算出的只是每一行的左半部分,由于右半部分与左半部分是对称的,转换一下就可以得到了。
代码如下:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<cstdio> using namespace std ; const int MAXN = 50005 ; long long R[MAXN] ; void init() { int t ; scanf("%d" , &t) ; int n , m ; scanf("%d%d" , &n , &m) ; R[0] = 1 ; R[1] = n ; long long tmp = n - 1 ; int i = 2 ; while (tmp > 0) // 规律部分 { tmp -= 2 ; R[i] = R[i - 1] + tmp ; i ++ ; } cout << t <<" " ; if(n % 2 == 0) { if(m > n / 2 + 1) { m = n - m ; } cout << R[m] << endl ; } else { if(m > n / 2) { m = n - m ; } cout << R[m] << endl ; } } int main() { int T ; scanf("%d" , &T) ; while (T --) { init() ; } return 0 ; }
D.
题目大意:抽象一下就是把几个二进制串拼接起来,然后转化为double行输出。
解题思路:这道题如果自己用字符串模拟也是可以的,但比较复杂。较好的方法是用 “位运算” ,同时要注意补码的转换问题和如何去掉答案末尾的0.
请看代码:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<cmath> #include<queue> #include<cstdio> using namespace std ; const int MAXN = 100 ; char s[MAXN] = {"PQWERTYUIOJ#SZK*?F@D!HNM&LXGABCV"} ; int su[MAXN] ; char res[111] ; int len ; void print() // 输出答案,主要是去掉末尾的0 { int lenr = strlen(res) ; int i ; int pan = 0 ; for(i = lenr - 1 ; i >= 0 ; i --) { if(res[i] >= '1' && res[i] <= '9') { res[i + 1] = '\0' ; break ; } if(res[i - 1] == '.'){ res[i + 1] = '\0' ; break ; } } cout << res << endl ; } void chu() // 初始化第一个符号所代表的序列 { len = strlen(s) ; int i ; for(i = 0 ; i < len ; i ++) { su[i] = i ; } } char xn , xm ; int n ; int m ; int x ; void init() { memset(res , 0 , sizeof(res)) ; int t ; scanf("%d" , &t) ; printf("%d " , t) ; cin >> xn ; scanf("%d" , &x) ; cin >> xm ; if(xm == 'F') m = 0 ; else m = 1 ; } void solve() { double ans = 0 ; int tmp ; int i ; for(i = 0 ; i < len ; i ++) { if(s[i] == xn) { tmp = su[i] ; break ; } } tmp = tmp << 12 ; x = x << 1 ; tmp += (x + m) ; int tp ; int t1 ; double q = pow(2 , -16) ; for(i = 1 ; i <= 16 ; i ++) { tp = 1 << (i - 1) ; t1 = tmp ; t1 &= tp ; if(t1 > 0) ans += q ; q *= 2.0 ; } tp = 1 << 16 ; // 判断符号位 t1 = tmp ; t1 &= tp ; if(t1 > 0) { if(ans == 0) { ans = 1 ; sprintf(res, "-%.16f\n" , ans) ; // 将答案转换为字符串,主要是为了去掉末尾的0 print() ; } else { ans = 1 - ans ; // 补码的转换 sprintf(res, "-%.16f\n" , ans) ; print() ; } } else { sprintf(res,"%.16f\n" , ans) ; print() ; } } int main() { chu() ; int T ; scanf("%d" , &T) ; while (T --) { init() ; solve() ; } return 0 ; }
H.
是一道找规律求组合数的问题。
代码如下:
#include<iostream> #include<cstring> #include<string> #include<algorithm> #include<vector> #include<cmath> #include<cstdio> #include<queue> using namespace std ; const int MAXN = 21 ; int n ; int k ; long long jie[MAXN] ; void chu() { long long i ; jie[0] = 1 ; for(i = 1 ; i < MAXN ; i ++) { jie[i] = i * jie[i - 1] ; } } void init() { int t ; scanf("%d" , &t) ; printf("%d " , t) ; scanf("%d%d" , &n , &k) ; } void solve() { long long ans = 0 ; if(k == 1) { ans = jie[n - 1] ; } else { long long tmp = 0 ; long long m = 0 ; int i ; ans = jie[m + 1] * jie[n - m - 2] ; // 核心代码 for(i = 1 ; i <= k - 2 ; i ++) { m = i ; tmp = jie[k - 2] / jie[m] / jie[k - 2 - m] ; ans += tmp * jie[m + 1] * jie[n - m - 2] ; } } cout << ans << endl ; } int main() { chu() ; int T ; scanf("%d" , &T) ; while (T --) { init() ; solve() ; } return 0 ; }