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 }