2015 Fall HIT Weekly Training 3

题目难度加了点。但还是针对新手的。

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 }

 

posted on 2015-10-31 21:03  AlanXue  阅读(125)  评论(0编辑  收藏  举报

导航