#502 div1+div2

A.The Rank

读完题后的第一思路自然是算出总和后用qsort进行主次关键字排序(qsort的多种用法)。

题目链接:A.The Rank

AC代码:

 1 #include <stdio.h>
 2 #include <stdlib.h>
 3 
 4 
 5 typedef struct
 6 {
 7     int id;
 8     int sum;
 9 }stu;
10 
11 int comp (const void *a, const void *b)
12 {
13     stu *c = (stu*)a;
14     stu *d = (stu*)b;
15     if(c->sum!=d->sum)
16         return d->sum - c->sum;
17     else
18         return c->id - d->id;
19 }
20 
21 
22 int main (void)
23 {
24     stu *s;
25     int n;
26     scanf("%d", &n);
27     s = (stu*)malloc(sizeof(stu)*n);
28     for(int i = 0; i < n; i++)
29     {
30         s[i].id = i + 1;
31         s[i].sum = 0;
32         for(int j = 0; j < 4; j++)
33         {
34             int temp;
35             scanf("%d", &temp);
36             s[i].sum += temp;
37         }
38     }
39 
40     qsort(s,n,sizeof(stu),comp);
41 
42     int rank = 1;
43     for(int i = 0; i < n; i++,rank++)
44     {
45 
46         if(s[i].id == 1)
47         {
48 
49             printf("%d",rank);
50             break;
51         }
52     }
53     return 0;
54 }

 

B.The Bits

读后可知是要将二进制数a的两个位置的数互换后使其与b的按位或值发生改变。

由于除了0|0 == 0 其它都为1,而且b的数无法旋转,故b中为1的位置是无法改变的,只需要考虑b中0对应的a的位置进行调换就行。

即0|0 -> 1|0 或者 1|0 - > 0|0

这里注意假设1和0同时存在,此处要注意会计算两次,要减去重复的次数。

题目链接:B.The Bits

AC代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <array>
 4 #include <set>
 5 #include <stack>
 6 #include <queue>
 7 #include <unordered_map>
 8 #include <algorithm>
 9 
10 using namespace std;
11 
12 int main()
13 {
14     long long int n;
15     cin >> n;
16     
17     string input1;
18     string input2;
19     cin >> input1;
20     cin >> input2;
21 
22     vector<int> v;
23     for(int i = 0; i < n; i ++)
24     {
25         if(input2[i]=='0')
26         {
27             v.push_back(i);
28         }
29     }
30 
31     long long int str1_zero = 0;
32     long long int str1_one = 0;
33     for(int i = 0; i < n; i ++)
34     {
35         if(input1[i]=='0')
36             str1_zero ++;
37         else
38             str1_one ++;
39     }
40     
41     long long int result = 0;
42     long long int count_one = 0;
43     long long int count_zero = 0;
44     for(int i = 0;i < v.size();i ++)
45     {
46         if(input1[v[i]] =='0')
47         {
48             result += str1_one;
49             count_zero++;
50         }
51         else
52         {
53             result += str1_zero;
54             count_one ++;
55         }
56     }
57     
58     result -= count_zero * count_one;
59     cout << result << endl;
60     return 0;
61 }

 

C. The Phone Number

题目简单翻译过来就是给你一个n让你把1-n的数排成一个序列使它的最长递减子序列和最长递增子序列加起来的和最小。

首先设递减子序列为a,递增子序列为b,若a+b最小,即由基本不等式a+b >=2*sqrt(ab)可知,使ab的值满足平方根即可。

题目链接:C. The Phone Number

AC代码:

 1 #include <iostream>
 2 #include <vector>
 3 #include <array>
 4 #include <set>
 5 #include <stack>
 6 #include <queue>
 7 #include <unordered_map>
 8 #include <algorithm>
 9 #include <math.h>
10 
11 using namespace std;
12 
13 int main()
14 {
15     int n;
16 
17     cin >> n;
18     vector<int> a;
19     for(int i = 1;i <= n;i ++)
20     {
21         a.push_back(i);
22     }
23     int sq = sqrt(n);
24 
25     while(n >= sq)
26     {
27         int tmp_count = sq;
28         while(tmp_count--)
29         {
30             cout << a[n-tmp_count-1] << " ";
31         }
32         n -= sq;
33     }
34     int count = 1;
35     while(n --)
36         cout << count++ << " ";
37     cout << endl;
38 
39     return 0;
40 }

 

posted @ 2018-08-09 14:04  Lokianyu  阅读(192)  评论(0)    收藏  举报