顺序根据过题人数由多至少排列
L-牛牛学走路
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,n,m;
cin>>t;
for(int i=0;i<t;i++){
string str;
cin>>n;
cin>>str;
double x=0,y=0,max=0,dis;
for(int j=0;j<n;j++){
if(str[j]=='U'){
y++;
}else if(str[j]=='D'){
y--;
}else if(str[j]=='L'){
x--;
}else if(str[j]=='R'){
x++;
}
dis=sqrt(x*x+y*y);
max=max>dis?max:dis;
}
printf("%.12f\n",max);
}
}
E-炸鸡块君的高中回忆
#include <bits/stdc++.h>
using namespace std;
int main(){
int t,n,m;
cin>>t;
for(int i=0;i<t;i++){
cin>>n>>m;
if(n==m) cout<<1<<endl;
else if(m==1) cout<<-1<<endl;
else{
int ans=(n-m)/(m-1)*2+1;
if((n-m)%(m-1)!=0) ans+=2;
cout<<ans<<endl;
}
}
}
J-小朋友做游戏
#include <bits/stdc++.h>
using namespace std;
int vc[200005];
int a,b,n,va[10005],vb[10005];
void merge(int ra,int rb,int va[],int vb[],int vc[]){
int i=0;
for(int j=0;j<ra;j++){
vc[i++]=va[j];
}
for(int j=0;j<rb;j++){
vc[i++]=vb[j];
}
return ;
}
int main(){
int t;
cin>>t;
for(int i=0;i<t;i++){//1000
cin>>a>>b>>n;
for(int j=0;j<a;j++) cin>>va[j];//10000
sort(va,va+a);
for(int j=0;j<b;j++) cin>>vb[j];//10000
sort(vb,vb+b);
if(2*a<n) cout<<-1<<endl;
else{
memset(vc,0,sizeof(vc));
int ans=0;
//从a里选的一定要多于半数
for(int j=a-1;j>a-(n+1)/2-1;j--){//10000
ans=ans+va[j];
}
//此时的ans是必选的va总和
merge(a-(n+1)/2,b,va,vb,vc);//10000
int cr=a+b-1;
sort(vc,vc+cr);
for(int j=cr-1;j>cr-n/2-1;j--){//100000
ans=ans+vc[j];
}
cout<<ans<<endl;
}
}
}
F-中位数切分
//题目说每一段有需要大于等于m
#include<bits/stdc++.h>
using namespace std;
int main(){
int T;
cin>>T;
while(T--){
int n,m;
cin>>n>>m;//数组长度为n,中位数要大于m
int cnt1=0,cnt2=0;//两个计数器
for(int i=0;i<n;i++) {//遍历数组a
int x;
cin>>x;//输入数组a中的数字
if(x<m) cnt1++;//cnt1记录小于整数m的个数
else cnt2++;//cnt2记录大于整数m的个数
}
if(cnt2>cnt1) cout<<cnt2-cnt1<<endl;//大于m的和小于m的相互抵消,剩下的作为每组的中位数即可得到最多的要求组数
else cout<<"-1"<<endl;//因为说偶数个数的中位数是两个中小的那个,这就要求只有大于m的数的个数大于小于m的个数时,才满足条件
}
}
H-牛牛看云
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
ll n,a[1000010],cnt[1010],ans=0;
int main(){
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
cnt[a[i]]++;//记录每个数字的个数
}
for(int i=0;i<=1000;i++){//遍历每个可能出现的数字0~1000
for(int j=i;j<=1000;j++){
ll add;//倍数
if(i==j) add=cnt[i]*(cnt[i]+1)/2;//相同的数字相加的倍数
else add=cnt[i]*cnt[j];
ans+=add*abs(i+j-1000);
}
}
cout<<ans;
}
A-九小时九个人九扇门
#include <bits/stdc++.h>
using namespace std;
const int mod=998244353;
int n,a[100010],dp[100010][10];
int main(){
cin>>n;//输入主人公的数量
for(int i=1;i<=n;i++){
cin>>a[i];//记录第i个主人公手表的数字
a[i]%=9;//一个数模9就是它的数字根,但9有些不一样,将它的数字根看做0
}
for(int i=1;i<=n;i++){//遍历每个数字1~n
for(int j=0;j<9;j++){
dp[i][(j+a[i])%9]=(dp[i-1][(j+a[i])%9]+dp[i-1][j])%mod;//前i个数字能组成的方案数
cout<<dp[i][(j+a[i])%9]<<" ";
}
dp[i][a[i]]++;//加上第i个数后,a[i]的方案自然多一种
cout<<endl;
}
for(int j=1;j<=9;j++){
cout<<dp[n][j%9]<<' ';
}
}