2020年04月05日-个人赛

A - The number of positions

题意:题意比较简单,简单描述一下就是一个小朋友去排队,他的前面至少有a个人,后面最多有b个人,求这个小朋友可能在的位置有几个,输出可能的数量。

题解:简单的模拟一遍即可

代码:

 1 #include<iostream>
 2 #include<set>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long 
 6 using namespace std;
 7 int main(){
 8     int n,a,b;
 9     cin>>n>>a>>b;
10     int ans=0;
11     for(int i=a+1;i<=n;i++){
12         if((n-i)<=b){
13             ans++;
14         }
15     }
16     cout<<ans<<endl;
17     return 0;
18     
19 } 

 B - Permutations

题意:这一题的题意比较简单:题目给你n个长度长度为k的数字,要求让你对其进行排列组合,这里要注意的是所有的数字在进行排列组合的的规则是一样的。要你求其中最大值减去最小值的差最小。

题解:这一题有很多解法比如利用DFS求出所有的排列种类,记录每种排列中的最值差,最后求其最小值即可,还有一个简便的方法:利用:next_permutation(a, a + n)函数它的作用是求出长度为n的数组a中所有的排列的秦情况,这种比DFS简便多了,然后就是求出每种排列方式下的最值并求差即可。

 1 #include <iostream>
 2 #include <cstdio>
 3 #include <cstring>
 4 #include <algorithm>
 5 using namespace std;
 6 const int nk_max = 44;
 7 const int INF = 0x3fffffff;
 8 int n, k;
 9 char number[nk_max][nk_max];
10 int bit[nk_max], sum, num_max, num_min, ans;
11 int main() {
12     while(~scanf("%d %d", & n, & k)) {
13         for(int i = 0; i < n; i ++){
14             scanf("%s", number[i]);//存储的数据 
15         }    
16         for(int i = 0; i < k; i ++){
17             bit[i] = i;
18 //            cout<<bit[i]<<" ";
19         }
20         ans = INF;//初始化为极大值 
21         do { // 求得是这一种全排列下的情况下的最小值 
22             num_max = 0, num_min = INF;
23             for(int i = 0; i < n; i ++) {//遍历  n 个 数据 
24                 sum = 0;
25                 for(int j = 0; j < k; j ++){//遍历  k 位数据 
26                     sum = sum * 10 + (number[i][bit[j]] - '0');
27                 }//化成 int 型
28                 num_max = max(num_max, sum);
29                 num_min = min(num_min, sum);
30             }
31             ans = min(ans, num_max - num_min);//更新最后大的答案 
32         } while(next_permutation(bit, bit + k));//求全排列 
33         printf("%d\n", ans);
34     }
35     return 0;
36 }

D - cAPS lOCK

题意:这一题也是一道简单的题目,主要就是要看清楚它的变化的规则:当单词全为大写的时候,就将所有的字母变为小写。当单词的第一个字母为小写的时候,后面的字母全为大写,将第一个字母改为大写,将之后的字母改为小写。其余其他的形式不要改变,在这个题中要注意细节。

题解:模拟,排除每种情况即可。

代码;

法一:

 1 #include<iostream>
 2 #include<set>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 int main() {
 8     string ptr;
 9     cin>>ptr;
10     int an=0,f=0;
11     for(int i=1;i<ptr.length();i++){
12         if(ptr[i]>='A'&&ptr[i]<='Z'){//大写字母的个数
13             f++;
14         }else if(ptr[i]>='a'&&ptr[i]<='z'){//小写字母的个数
15             an++;
16         }
17     }
18     if(an==0&&f!=0||ptr.length()==1){
19         if(ptr[0]>='a'&&ptr[0]<='z'){
20             ptr[0] = toupper(ptr[0]);//转换为大写
21         }else if(ptr[0]>='A'&&ptr[0]<='Z'){
22             ptr[0] = tolower(ptr[0]);//转换为小写
23         }
24         for(int i=1;i<ptr.length();i++){
25             ptr[i] = tolower(ptr[i]);//转换为小写
26         }
27     }
28     cout<<ptr;
29     return 0;
30 
31 }

法二

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 using namespace std;
 6 int app1(string ptr){
 7     for(int i=0;i<ptr.length();i++){
 8         if(ptr[i]>='a'&&ptr[i]<='z'){
 9             return 0;
10         }
11     }
12     return 1;
13 }
14 int app2(string ptr){
15     for(int i=1;i<ptr.length();i++){
16         if(ptr[i]>='a'&&ptr[i]<='z'){
17             return 0;
18         }
19     }
20     return ptr[0]>='a'&&ptr[0]<='z';
21 }
22 int main() {
23     string ptr;
24     cin>>ptr;
25     if(ptr.length()==1) {//长度为 1 
26         if(ptr[0]>='A'&&ptr[0]<='Z'){//大写 
27             ptr[0]=tolower(ptr[0]);
28         }else{
29             ptr[0]=toupper(ptr[0]);//变大写 
30         }
31     }else{//长度不为  1 
32         int f1=app1(ptr);
33         int f2=app2(ptr);
34         if(f1||f2){//符合两个规则之一 
35             for(int i=0;i<ptr.length();i++){
36                 if(i==0){//第一个字母 
37                     if(ptr[i]>='A'&&ptr[i]<='Z'){
38                         ptr[i]=tolower(ptr[i]);//变小写 
39                     }else{
40                         ptr[i]=toupper(ptr[i]);//变大写 
41                     }
42                 }else{
43                     for(int i=1;i<ptr.length();i++){
44                         ptr[i]=tolower(ptr[i]);
45                     }
46                 } 
47             }
48         }
49     } 
50     cout<<ptr;
51     return 0;
52 }

E - Opposites Attract

题意:大概的意思就是给你一串数,要你判断这串数中有几对数可以相加之和为 0

题解:由于数据范围比较小,我们可以用数组来计算每个数出现的次数,可以把每个元素都加上10,就可以将他们全部化为正数,在进行判断的时候,我们只需记录i 与20-i的乘积之和即可,但要注意对特殊情况的判断。

代码:

 1 #include<iostream>
 2 #define ll long long
 3 using namespace std;
 4 ll ans=0;
 5 int main() {
 6     ll n,t;
 7     cin>>n;
 8     ll num[200]= {0};
 9     for(int i=0; i<n; i++) {
10         cin>>t;
11         num[t+10]++;
12     }
13     
14     for(int i=0; i<=10; i++) {
15         if(num[i]!=0) {
16             if(i==10) { //说明原始值  是  0 ,
17                 ans=ans+num[i]*(num[i]-1)/2;
18             }else{
19                 ans=ans+num[i]*num[20-i];
20             }
21         }
22     }
23     cout<<ans<<endl;
24     return 0;
25 }

F - The World is a Theatre

题意:这一题其实是一个排列组合的问题,只不过加了一个限制,男生的人数不是少于4,女生的人数不少于1,组成的团队的人数为t。

题解:这里唯一要注意的就是组合数的计算方法,这里先达标打表杨辉三角,组合数和杨辉三角形表是一一对应的,

代码:

法一:

 1 #include<iostream>
 2 #include<set>
 3 #include<cstring>
 4 #include<algorithm>
 5 #define ll long long
 6 using namespace std;
 7 ll f[110][110];
 8 void app() {
 9     memset(f,0,sizeof(f));
10     for(int i=0; i<=30; i++) {
11         f[0][i]=0;
12         f[i][0]=1ll;
13     }
14     for(int i=1; i<=30; i++) {
15         for(int j=1; j<=i; j++) {
16             f[i][j]=(f[i-1][j]+f[i-1][j-1]);
17         }
18     }
19 }
20 
21 int main() {
22     int n,m,t;
23     scanf("%d%d%d",&n,&m,&t);
24     //t为总人数
25     app();
26     if(n<4||m<1||t<5) {
27         cout<<0<<endl;;
28     } else {
29         ll sum=0;
30         for(int i=4; i<=n&&t-i>=1; i++) {
31             sum=sum+f[n][i]*f[m][t-i];
32         }
33         printf("%I64d\n",sum);
34     }
35     return 0;
36 }

 法二:

 1 #include<iostream>
 2 #include<cstring>
 3 #include<algorithm>
 4 #define ll long long
 5 using namespace std;
 6 ll conb[250][250];
 7 //(n<25,m<25)
 8 ll f[110][110];
 9 void app() {
10     memset(f,0,sizeof(f));
11     for(int i=0; i<=30; i++) {
12         f[0][i]=0;
13         f[i][0]=1ll;
14     }
15     for(int i=1; i<=30; i++) {
16         for(int j=1; j<=i; j++) {
17             f[i][j]=(f[i-1][j]+f[i-1][j-1]);
18         }
19     }
20 }
21 ll  sum=0;
22 int main() {
23     ll n,m,t;
24     cin>>n>>m>>t;
25     app();
26     for(int i=4; i<=t&&t-i>=1;i++) {
27         sum=sum+f[n][i]*f[m][t-i];
28     }
29     cout<<sum<<endl;
30     return 0;
31 }

猜你喜欢

转载自www.cnblogs.com/blogxsc/p/12640935.html