zoukankan      html  css  js  c++  java
  • 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
    ", 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
    ",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 }
  • 相关阅读:
    什么是知行动手实验室?
    SpringBoot Admin2.0 集成 Java 诊断神器 Arthas 实践
    一文读懂容器存储接口 CSI
    AI 事件驱动场景 Serverless 实践
    一不小心,它成为了 GitHub Alibaba Group 下 Star 最多的开源项目
    5G 和云原生时代的技术下半场,视频化是最大最新的确定性
    基于 RocketMQ Prometheus Exporter 打造定制化 DevOps 平台
    Knative 基于流量的灰度发布和自动弹性实践
    阿里的 RocketMQ 如何让双十一峰值之下 0 故障?
    阿里巴巴开源容器镜像加速技术
  • 原文地址:https://www.cnblogs.com/blogxsc/p/12640935.html
Copyright © 2011-2022 走看看