2020.4.5 个人rating赛 解题+补题报告

A The number of positions

 1.题意

  给定n个人从1到n排队,其中一个人前面不少a人,后面不超过b人,问这个人可选的位置有多少个。

 2.题解

  满足两个条件,前面大于等于a人,即可选位置至多为从a+1往后共n-a个,后面小于等于b人,即可选位置至多为从后往前共b+1个,取交集。

 3.代码

  

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 int n,a,b;
 4 int main(){
 5     cin>>n>>a>>b;
 6     if(n-a>1+b)
 7         cout<<1+b<<endl;
 8     else
 9         cout<<n-a<<endl;    
10     
11     return 0;
12 }

 

B Permutations

 

 1.题意

   给定n个k位数,可以任意打乱数字之间的顺序,允许前导零,使在同一种排列规则下的最大值和最小值之差最小。

 2.题解

  全排列函数next_permutation,用二维数组存各数各位,一维数组存各数,ans维护最小值。

 3.代码

 

#include<bits/stdc++.h>
#define inf 0x3f3f3f3f
using namespace std;
int n,k;
int a[10][10];
int b[10][10];
int c[10];
int d[]={1,2,3,4,5,6,7,8,9};
int ans=inf;
void f(int n){
    int sum=0;
    for(int i=8;i>=0;i--){
        sum*=10;
        sum+=b[n][i];
    }
    c[n]=sum;
    return ;
}
int main(){
    cin>>n>>k;
    char ch;
    for(int i=0;i<n;i++){
        for(int j=0;j<k;j++){
            cin>>ch;
            a[i][j]=ch-'0';
        }
    }

    int mmin=inf;

    while(1){
        for(int i=0;i<n;i++)
            for(int j=0;j<k;j++)
                b[i][j]=a[i][d[j]-1];
        
        for(int i=0;i<n;i++)
            f(i);
        
        sort(c,c+n);
        mmin=min(mmin,c[n-1]-c[0]);
        if(!next_permutation(d,d+k))
            break;
    }
    cout<<mmin<<endl;
    
    return 0;
}

 

D cAPS lOCK

 

 1.题意

   给定一个单词,如果所有字母都是大写或只有第一个字母是小写,将这个单词的所有字母大小写反转后输出,否则按照原来的输入将这个单词输出。

 2.题解

   先忽略第一个字母,如果后面的字母有小写,则将单词原样输出,否则反转输出。

 3.代码

 

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 string s;
 4 int main(){
 5     cin>>s;
 6     int flag=1;
 7     for(int i=1;i<s.size();i++){
 8         if(s[i]>'Z'){
 9             flag=0;
10             break;
11         }
12     }
13     if(flag){
14         for(int i=0;i<s.size();i++){
15             if(s[i]<95)
16                 printf("%c",s[i]+32);
17             else
18                 printf("%c",s[i]-32);
19         }
20             
21     }
22     else{
23         for(int i=0;i<s.size();i++)
24             printf("%c",s[i]);
25     }
26     
27     return 0;
28 }

 

E Opposites Attract

 

 1.题意

   给定n个数,两个数若相加位0,则它们可以配对,问一共有几对。

 2.题解

   用map存储,0特判。

 3.代码

 

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 mp<int,int> mp;
 5 int main(){
 6     int n;
 7     cin>>n;
 8     for(int i=0;i<n;i++){
 9         int a;
10         cin>>a;
11         mp[a]++;
12     }
13     ll sum=mp[0]*(mp[0]-1)/2; //组合数cn2 拆开 
14     for(int i=1;i<=10;i++) //数据范围-10<=ti<=10 
15         sum+=mp[i]*mp[-i];
16         
17     cout<<sum<<endl;
18     
19     return 0;
20 }

 

 

 

 

F The World is a Theatre

 1.题意

   在n个男孩和m个女孩中选择t人,其中至少有4个男孩和1个女孩,问共有多少种选择方式。

 2.题解

   组合数问题。

 3.代码

 

 1 #include<bits/stdc++.h>
 2 #define ll long long
 3 using namespace std;
 4 ll c(ll n,ll m){
 5     ll fac=1;
 6     for(int i=1;i<=m;i++)
 7         fac=fac*(n-m+i)/i;
 8     return fac;
 9 }
10 ll n,m,t,ans;
11 int main(){
12     cin>>n>>m>>t;
13     for(ll i=4;i<=n;i++)
14         if(i<t&&t-i<=m) 
15                ans+=c(n,i)*c(m,t-i);
16                
17     cout<<ans<<endl;
18     
19     return 0;
20 }

 

 

 

上一篇:HDU-1811 Rank of Tetris


下一篇:【死磕JVM】看完这篇我也会排查JVM内存过高了 就是玩儿!