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 ;
}