题目难度加了点。但还是针对新手的。
A.Diff
这题猛一看没想出来。
其实就是把数据归类就行了。
让(A[i]-i)相等的数归为一类,他们中任意两个数都满足A[i] = A[i-k]+k
a[i-flag]表示A[i]-i == i-flag的个数。
答案就是n - max{a[i]}
1 #include<cstdio> 2 #include<iostream> 3 #include<string.h> 4 using namespace std; 5 6 #define flag 1000000 7 8 int a[2000010]; 9 int b[100010]; 10 11 int main(void) 12 { 13 int n; 14 int max; 15 scanf("%d", &n); 16 while(n > 0){ 17 //printf("****%d\n", n); 18 memset(a, 0, sizeof(a)); 19 for(int i = 0; i < n; ++i) scanf("%d", &b[i]); 20 for(int i = 0; i < n; ++i) a[b[i]-i+flag]++; 21 max = 0; 22 for(int i = 0; i < 2000000; ++i) 23 if(a[i] > max) 24 max = a[i]; 25 printf("%d\n", n-max); 26 scanf("%d", &n); 27 } 28 return 0; 29 }
B.Dogs
这就是一道烂大街的逻辑题。答案是K。
1 #include<cstdio> 2 3 int main(void) 4 { 5 int m, n; 6 while(scanf("%d%d", &m, &n) == 2) printf("%d\n", n); 7 return 0; 8 }
C.The Position
这题一理解错“no more than”的意思了。
不少于a个人在前面,就限定了只可能在[a+1, n]中
不多于b个人在后面,就限定了只可能在[n-b, n]中
取交集,其中的个数就是min{n-a, b+1}
1 #include<cstdio> 2 3 #define min(a,b) (a) > (b) ? (b) : (a) 4 5 int main(void) 6 { 7 int a, b, c; 8 while(scanf("%d%d%d", &a, &b, &c) == 3) printf("%d\n", min(a-b,c+1)); 9 return 0; 10 }
D.Restoring Password
就是考一下字符串的简单处理。
1 #include<cstdio> 2 #include<string> 3 #include<iostream> 4 using namespace std; 5 6 int main(void) 7 { 8 string st; 9 string s; 10 string a[10]; 11 while(cin>>st){ 12 for(int i = 0; i < 10; ++i) cin>>a[i]; 13 for(int i = 0; i < 80; i += 10){ 14 s = st; 15 s.erase(i+10, 70-i); 16 if(i > 0) s.erase(0, i); 17 //cout<<s<<endl; 18 for(int j = 0; j < 10; ++j) 19 if(s == a[j]){ 20 cout<<j; 21 break; 22 } 23 } 24 cout<<endl; 25 } 26 return 0; 27 }
1.st.erase(x, y)表示的的是从第x个开始删除y个
2.string貌似用cin,cout比较舒服,反正scanf,printf编译器没过去
E.Rotating
这道题貌似多年之前在COGS上做过。
就是一道数学题,去模拟就行了。
不过提交一次就过了我确实是不敢相信。
1 #include<cstdio> 2 #include<cmath> 3 4 #define PI 3.1415926535898 5 6 double dis(int n, int k){ 7 return sqrt(2-2*cos(k*2*PI/n)); 8 } 9 10 int main(void) 11 { 12 int N; 13 int n, s; 14 double cir; 15 double ans; 16 scanf("%d", &N); 17 for(int z = 0; z < N; ++z){ 18 scanf("%d%d", &n, &s); 19 cir = 0; 20 for(int i = 1; i <= n; ++i) cir += dis(n,i)*(2*PI)/n; 21 ans = s / n * cir; 22 for(int i = 1; i <= s % n; ++i) ans += dis(n,i)*(2*PI)/n; 23 printf("%.2f\n", ans); 24 } 25 return 0; 26 }
时间: 2024-11-03 21:00:30