题意:有n个同学的名字,把他们分到两个教室,同学首字母相同的算一对,求怎样使得分的对数最少。
思路:对于每个首字母对半分。
#include<bits/stdc++.h>
using namespace std;
int main(){
int a[27];
int n;
scanf("%d",&n);
string s;
memset(a,0,sizeof(a));
for(int i=0;i<n;i++){
cin>>s;
a[s[0]-'a']++;
}
int ans=0;
for(int i=0;i<26;i++){
int t=a[i]/2;
int t1=a[i]-t;
ans=ans+t*(t-1)/2;
ans=ans+t1*(t1-1)/2;
}
printf("%d\n",ans);
}
题意:给定k,n*m等于k,使得n行和m列,每行和每列都有5个元音字母。
思路:模拟即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int k;
scanf("%d",&k);
if(k<25)
puts("-1");
else{
int t=5;
while(k%t){
t++;
}
int t1=k/t;
if(t1<5)
puts("-1");
else{
string s;
s+='a';
s+='i';
s+='e';
s+='u';
s+='o';
for(int i=0;i<t1-5;i++)
s+='a';
s+='o';
s+='e';
s+='u';
s+='a';
s+='i';
for(int i=0;i<t1-5;i++)
s+='e';
s+='u';
s+='o';
s+='i';
s+='e';
s+='a';
for(int i=0;i<t1-5;i++)
s+='i';
s+='i';
s+='u';
s+='a';
s+='o';
s+='e';
for(int i=0;i<t1-5;i++)
s+='o';
s+='e';
s+='a';
s+='o';
s+='i';
s+='u';
for(int i=0;i<t1-5;i++)
s+='u';
for(int i=0;i<t-5;i++){
s+='e';
s+='a';
s+='o';
s+='i';
s+='u';
for(int j=0;j<t1-5;j++)
s+='a';
}
cout<<s<<"\n";
}
}
}
题意:任选两个数x,y要求 |x−y||x−y| 到 |x+y||x+y| 这个区间要包含|x|到|y|,问这样的对有多少个(不计位置重复对)
思路:排个序,遍历模拟一遍。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int a[200005];
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
scanf("%d",&a[i]);
if(a[i]<0)
a[i]*=-1;
}
sort(a,a+n);
int l=0,r=1;
ll ans=0;
while(r<n){
if(a[r]-a[l]<=a[l]){
ans+=(r-l);
r++;
}
else l++;
}
printf("%lld\n",ans);
}
题意:有 n 种商品,每个商品有一个未知的权值,有 m天,每天一个整数 k 代表这一天拿了 k 个商品,接下来是 k 个整数,代表商品的下标。问是否存在一种分配权值的方案,使得每一天拿的所有商品权值的 LCM都严格大于补集中所有商品权值的 LCM。
思路:任意两天拿的石头必须有交集即可。
#include<bits/stdc++.h>
using namespace std;
int vis[55][10005];
int main(){
memset(vis,0,sizeof(vis));
int n,m;
scanf("%d%d",&m,&n);
int x,k;
for(int i=1;i<=m;i++){
scanf("%d",&k);
while(k--){
scanf("%d",&x);
vis[i][x]=1;
}
}
for(int i=1;i<=m;i++){
for(int j=1;j<=m;j++){
int f=0;
for(int k=1;k<=n;k++){
if(vis[i][k]&&vis[j][k])
f=1;
}
if(!f){
puts("impossible");
return 0;
}
}
}
puts("possible");
}