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 }