QFNU-ACM 2021.3.3 Rating 补题/解题报告
A
Nlogonia高中一年级有n个学生。校长希望把学生分成两间教室。两个名字以相同字母开头的截然不同的学生如果被放在同一间教室里,他们会很健谈,求最少可能有多少聊天组
解题思路:计算每个字母开头的有多少人,>=2时,平均分到两组,计算每组与多少的聊天组相加
#include<bits/stdc++.h> using namespace std; typedef long long ll; int main() { int n,i,a[30]={0}; string s; cin>>n; for(i=0;i<n;i++){ cin>>s; a[s[0]-'a']++; } int sum=0; for(i=0;i<26;i++){ if(a[i]>2){ int x=a[i]/2; int y=a[i]-x-1; x--; while(x!=0){ sum+=x; x--; } while(y!=0){ sum+=y; y--; } } } cout<<sum<<endl; return 0; }
B
给你一个k,然后问:是否存在一个矩阵 , n *m = k, 然后每一行都有5个元音字母,每一列也都有一个元音字母。如果有的话输出,没有的话输出-1
先求出一组n,m,,n,m都>5,循环判断能不能整除k,再求这个矩阵,我是把它分成四块
右上角5*5的矩阵,左上角,竖着写aeiou,右下角,横着写aeiou,左下角,随便写,再按行输出就行
#include<bits/stdc++.h> using namespace std; typedef long long ll; char b[5][5]={'a','e','i','o','u', 'e','i','o','u','a', 'i','o','u','a','e', 'o','u','a','e','i', 'u','a','e','i','o', }; char c[5]={'a','e','i','o','u'}; int main() { int k; cin>>k; double x=sqrt(k); int m=0,n=0; for(int i=int(x+1);i>0;i--){ if(k%i==0){ if(i>=5&&((k/i)>=5)){ m=i; n=k/i; break; } } } if(m==0&&n==0){ cout<<-1<<endl; }else{ int i,j; for(i=0;i<m;i++){ for(j=0;j<n;j++){ if(i<5){ if(j<5){ cout<<b[i][j]; } if(j>=5){ cout<<b[i][0]; } }else{ if(j<5){ cout<<c[j]; }else{ cout<<'a'; } } } } } return 0; }
C
给出一组数据,找出其中有多少组(a,b)使|a-b|<|a|,|b|<|a+b|;
a,b取绝对值,ab,ba为一组
思路:只需判断a-b是否小于a,b中小的那一个
a,b不行,a,b+1肯定也不行啦
#include <cstdlib> #include<bits/stdc++.h> using namespace std; int main( ) { int n,i; long long sum=0; int a[200010]; cin>>n; for(i=0;i<n;i++){ cin>>a[i]; a[i]=abs(a[i]); } sort(a,a+n); int z=0,y=1; while(z<n&&y<n){ if(a[y]-a[z]<=a[z]){ sum+=y-z; y++; //cout<<sum<<endl; } else z++;; } cout<<sum<<endl; return 0; }