@P2Oileen
2017-08-05T03:19:17.000000Z
字数 4183
阅读 1464
标★的题目为选做题,仅供学有余力的同学尝试,并且评分标准也更严格。请先做完不标★的题目,再尝试做标一个★的题目,再尝试做更多★的题目。
本次作业总分:30+4.0
35
30
全国青少年信息学奥林匹克联赛
email提交,8.4晚23:33之前(qwq)
在这些题目中,我们只考虑通常的NOI Linux比赛环境:计算机的字长为32位,有符号整数类型采用补码(2's complement)方法表示。并且,我们暂且不考虑C++标准的要求,只考虑实际编译器的效果。
对于下面的整数类型,指出其宽度(以二进制位计)、能表示的最小数、能表示的最大数。并指出类型描述的哪些词可以被省略。
例子:signed int
,是整数类型,宽度为32,能表示的最小数为-2147483648,能表示的最大数为2147483647,signed可被省略。
(注:C++标准对此宽度的限制仅为“至少为16”,但通常的实践中都是至少为32,在上述的环境中为32,所以本题中我们先不管C++标准对于宽度的限制)
unsigned short int
short short int
int
unsigned int
long int signed
int long unsigned long
signed char
double
类型 | 宽度 | 最小数 | 最大数 | 省略后 |
---|---|---|---|---|
unsigned short int | 16 | 0 | 65535 | unsigned short |
short short int | 16 | -32768 | 32767 | short |
int | 32 | -2147483648 | 2147483647 | int |
unsigned int | 32 | 0 | 4294967295 | unsigned int |
long int signed | 64 | -9223372036854775808 | 9,223,372,036,854,775,807 | long long |
int long unsigned long | 64 | 0 | 18,446,744,073,709,551,615 | unsigned long long |
signed char | 8 | -128 | 127 | char |
double | 64 | 1.79769e+308 | 2.22507e-308 | double |
#include <cstdio>
int main()
{
unsigned int a = 233;
scanf("%u", &a);
if(a == -a){
printf("OK\n");
return 0;
}
else return 1;
}
输入什么会输出OK?请给出两个答案(如果你只能想出一个就写一个),输入中不能有任何空白字符。
0
2147483648
#include <cstdio>
int main()
{
float a = 2.33;
scanf("%f", &a);
if(a != a){
printf("OK\n");
return 0;
}
else return 1;
}
输入什么会输出OK?请给出两个答案(如果你只能想出一个就写一个),输入中不能有任何空白字符。
你最好能够理解以下每个函数的功能。请简单写下以下每个函数的功能,如果你认为你已经熟练掌握则不必写。
这道题为选做题的原因并不是因为难度,而是题太多了……
<cmath>
sin log atan2 fmod remainder
<cctype>
isdigit
<cstdlib>
atoi strtoul
<cstring>
strcpy strncpy strcat strncat strlen strcmp strncmp strstr
memcmp memset memcpy memmove
库 | 函数 | 功能 |
---|---|---|
cmath | sin | 得到角对应的弧度 |
log | 求以e为底的对数,可以用换底公式得到以其它为底的对数 | |
atan2 | 求tan的反函数,范围从-pi~pi | |
fmod | 浮点数取余 | |
remainder | 除法运算的有符号余数 | |
cctype | isdigit | 检查c是否为0-9 |
cstdlib | atoi | 将字符串转换为整型 |
strtoul | 将字符串转换为无符号整型 | |
cstring | strcpy | 复制字符串 |
strncpy | 把指定长度和首指针的字符串复制了 | |
strcat | 将两个字符串首尾相连 | |
strncat | 将第二个字符串前n位连到第一个后面 | |
strlen | 求字符串长度 | |
strcmp | 比较字符串大小 | |
strncmp | 比较两字符串的n个字符 | |
strstr | 判断一个串是否为另一个串的子串 | |
memcmp | 比较两块内存区域的前n个字节 | |
memset | 将一块内存区域刷成一个ascii值 | |
memcpy | 将一块内存拷贝到另一个地方 | |
memmove | 保证源串在被覆盖前将重叠区域的字节拷到目标区域中 |
#include <cstdio>
#include <cstring>
#include <ctime>
struct Test
{
char a; int b; short c;
};
void test()
{
Test t = {
.a = 'a', .b = 2333, .c = 666
};
Test u =
{
.a = 'a', .b = 2333, .c = 666
};
if(memcmp(&t, &u, sizeof(Test)) == 0)
printf("t == u\n");
else printf("t != u\n");
}
void magic()
{
int a[6] = {2, 3, 3, 6, 6, 6};
printf("magic %d\n", a[time(0) % 6]);
}
int main() {
for(int i = 0; i < 3; i++)
{
test();
magic();
}
return 0;
}
在不同的编译器、编译选项下运行都会得到不同的结果,并且会经常出现t != u
的输出,这是为什么呢?难道是因为定义t
和u
的时候一个大括号换行了而另一个没有???
我觉得这个magic肯定不是看着玩的……所以大概和它有关233333
d
1.
g
2.
b
2.
b
3.
d
4.
e
5.
e
6.
i
7.
d
8.
d
10.
d
9. ★
b
10. ★
d
10. ★
e
10. ★
i
10. ★
可供选择的选项:
A.
B. ,但不是A
C. ,但不是A,也不是B
D. ,但不是以上任何选项
E. ,但不是以上任何选项
F. ,但不是以上任何选项
G. ,但不是以上任何选项
H. ,但不是以上任何选项
I. ,但不是以上任何选项
J. ,但不是以上任何选项
K. ,但不是以上任何选项
L. ,但不是以上任何选项
M. 不是以上任何选项
判断下列代码的时间复杂度。请用大记号,或用你认为最紧的大记号来表示。本题中假定每个变量的取值范围不受计算机字长限制。
O(n^2)
for(i = 1; i <= n; i++)
for(j = 1; j <= i; j++)
ans++;
O(n^3)
for(i = 1; i <= n; i++)
for(j = 1; j <= i; j++)
for(k = i; k <= n; k++)
ans++;
O(logn)
for(i = 1; i <= n; i *= 2)
ans++;
O(nlogn)
for(i = 1; i <= n; i++)
for(int j = 1; j <= i; j *= 2)
ans++;
O(lognlogn)
for(i = 1; i <= n; i *= 2)
for(int j = 1; j <= i; j *= 2)
ans++;
O(nlogn)
for(i = 1; i <= n; i++)
for(int j = 1; j <= n; j += i)
ans++;
O(n)
for(i = 1; i <= n; i *= 2)
for(int j = 1; j <= n; j += i)
ans++;
O(2^x)
void f(int x) {
if(x >= 3) {
f(x - 1);
f(x - 2);
ans++;
}
}
f(n);
O(x)
void f(int x) {
if(x >= 2) {
f(x / 2);
f(x / 2);
ans++;
}
}
f(n);
O(x^2)
void f(int x) {
if(x >= 2) {
f(x / 2);
f(x / 2);
for(int i = 1; i <= x; i++)
ans++;
}
}
f(n);
O(x^2)
void f(int x) {
if(x >= 2) {
ans++;
for(int i = 1; i < x; i++)
f(i);
}
}
f(n);
void f(int n, string s) {
ans++;
if(s.length() < n)
for(char c = '0'; c < '0' + n; c++)
if(s.find(c) == string::npos)
f(n, s + c);
}
f(n, "");
O(2^x)
void f(x) {
if(x >= 4) {
f(x - 1);
f(x - 3);
ans++;
}
}
f(n);
提示:实在判断不准的,可做实验试试。
对于每道题,回答“对”或“错”或“目前无法确定”。
对
1. 如果存在一个NP-完全问题能被确定图灵机在多项式时间内解决,则所有NP问题都能被这样解决。
错
2. 任何NP问题都不是P问题。
对
3. 存在一个问题,既是NP问题,又是NP-难问题。
错
4. ★存在一个问题,既是P问题,又是NP-完全问题。
目前无法确定
5. ★如果存在一个NP-难问题能被确定图灵机在多项式时间内解决,则所有NP-完全问题都能被这样解决。