A(水题)
题意:上面一堆废话,目标所有游客都可以根据每个人游览过的景点数量进行分类。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e4+10;
const int mod=998244353;
int a[N];
int main(){
int n;
cin>>n;
for(int i=1;i<=n;i++){
int num=0;
for(int i=1;i<=4;i++){
int x;
cin>>x;
if(x!=0)num++;
}
a[i]=num;
}
for(int i=1;i<=n;i++){
if(a[i]==0){
cout<<"Typically Otaku"<<endl;
}
else if(a[i]==1){
cout<<"Eye-opener"<<endl;
}
else if(a[i]==2){
cout<<"Young Traveller"<<endl;
}
else if(a[i]==3){
cout<<"Excellent Traveller"<<endl;
}
else {
cout<<"Contemporary Xu Xiake"<<endl;
}
}
}
D(几何题)
题意:求赛车与内边界相切情况下,赛道最短长度。画图之后会看到两种情况分类讨论即可(懒得插图)
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const int mod=998244353;
ll a[N];
int main(){
int t;
cin>>t;
double pi=acos(-1);
while(t--){
double a,b,r,d;
cin>>a>>b>>r>>d;
double Tan = b/(a + r);
double ans;
//cout<<Tan<<" "<<tan(d*pi/180)<<endl;
if(Tan<tan(d*pi/180)|| (Tan>0&&tan(d*pi / 180) < 0))
ans=sqrt(pow(a+r,2)+pow(b,2))-r;
else{//角度过小
double jiao=d*pi/180;
ans=r*cos(jiao)+b*sin(jiao)+a*cos(jiao)-r;
}
printf("%.12lf\n",ans);
}
}
I
题意有n个点,选其中k个使其两两之间距离和最大。
思路:考虑距离最大,优先选择两侧的点,进行配对。每次选择分奇偶讨论,选择奇数点时,相当于加上当前所有的对的距离和。偶数时,形成了新的一对,当前所有对的距离和增加,总距离再加上所有对的距离和。
#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
const int mod=998244353;
ll a[N];
int main(){
int t;
cin>>t;
while(t--){
int n;
cin>>n;
a[1]=0;
for(int i=2;i<=n;i++){
ll x;
scanf("%lld",&x);
a[i]=a[i-1]+x;
}
ll ans=0,cur=0;
int l=0,r=n+1;
int flag=0;
for(int i=1;i<=n;i++){
if(i&1){
l++;
ans+=cur;
}
else{
r--;
cur+=a[r]-a[l];
ans+=cur;
}
if(flag==1)cout<<" ";
cout<<ans;
flag=1;
}
printf("\n");
}
}