XJOI 奋斗群群赛4
A - Arpa and a research in Mexican wave
题意
有n个人,最多有k个人站起来,每秒都有一个人站起来或者是坐下,详情见题目里的note。
题解
很简单,分三类讨论即可。
#include<bits/stdc++.h>
using namespace std;
int main(){
int n,k,t;
cin>>n>>k>>t;
if(t<=k) cout<<t;
else if(t>k&&t<n) cout<<k;
else cout<<n+k-t;
}
B - Arpa and an exam about geometry
题意
输入三个点的坐标(ax,ay),(bx,by),(cx,cy),如果这三个点能绕一个点,使得a点旋转至b点,c点旋转至d点,则输出“Yes”,否则输出“No”。
题解
判断b的距离到a的距离,b的距离到c的距离是否相等,三点是否不共线,若同时满足,则输出”Yes“,反之输出”No“
#include<bits/stdc++.h>
using namespace std;
typedef long long int ll;
ll f(ll a,ll b,ll c,ll d){
return (c-a)*(c-a)+(d-b)*(d-b);
}
int main(){
ll ax,ay,bx,by,cx,cy;
cin>>ax>>ay>>bx>>by>>cx>>cy;
if(f(ax,ay,bx,by)==f(bx,by,cx,cy)&&(bx-ax)*(by-cy)!=(bx-cx)*(by-ay)) cout<<"Yes";
else cout<<"No";
return 0;
}
C - Five Dimensional Points
题意
有n个五维的点,求有多少个“好“点,对于“好”点、“坏”点的定义如下:
“好”点:设该点为a,在所给点中任意两个不相等且不为a的点b,c,向量ab与向量bc的夹角均不为锐角。
“坏”点:不是“好”点的点都是“坏”点
题解
可以从二维三维的方向来考虑,在二维中,一个“好”点的周围最多有4个点(x正负方向两个,y正负方向两个),三维则有6个(加上z方向上两个),可以知道,五维的情况下,一个“好”点周围最多有10个点,加上自身,即图中有“好”点的情况下,最多有11个点,即n>11时不可能存在“好”点,然后n<=11的情况就枚举一下就行了。
#include<bits/stdc++.h>
using namespace std;
int point[10000][10],dis[10000][10],flag,ans[10000],cnt=0;
int main(){
int n;
scanf("%d",&n);
for(int i=1;i<=n;i++){
for(int j=1;j<=5;j++){
scanf("%d",&point[i][j]);
}
}
if(n>11){
cout<<"0";
return 0;
}
for(int i=1;i<=n;i++){
memset(dis,0,sizeof(dis));
flag=1;
for(int j=1;j<=n;j++) {
if(j==i) continue;
for(int k=1;k<=5;k++){
dis[j][k] = point[j][k]-point[i][k];
}
for(int k=1;k<j;k++){
if(k==i) continue;
int s=0;
for(int l=1;l<=5;l++){
s=s+dis[k][l]*dis[j][l];
}
if(s<=0) continue;
else {
flag = 0;
break;
}
}
if(!flag) break;
}
if(flag) ans[++cnt] = i;
}
cout<<cnt<<endl;
for(int i=1;i<=cnt;i++){
cout<<ans[i]<<" ";
}
}
D - Polycarpus’Dice
题意
有n个骰子,需要每个骰子累加和为A,接下来一行n个数,表示这n个骰子的最大点数(也就是说能扔出从1-di这么些个值),问每个骰子有多少个点数扔出来之后其他骰子无论如何扔都满足不了累加和为A的条件。
题解
找出每个骰子满足条件最大的和最小值找出来即可。 找出小于最小值的数目 就是让其他的骰子取最大值,再让他们相加得一和,再用A减去上面的结果就是满足条件的最小的值,之后再减1(因为还满足。。。) 找出大于最大值的数目 用A减去n(n个骰子的最小值),之后再用di减去上面的结果,之后再减1(因为还满足。。。)
#include<bits/stdc++.h>
using namespace std;
const int N=1000000;
typedef long long int ll;
ll d[N];
int main(){
ll n;
ll A;
cin>>n>>A;
ll s=0;
for(int i=1;i<=n;i++){
cin>>d[i];
s=s+d[i];
}
if(n==1){
cout<<d[1]-1;
return 0;
}
for(int i=1;i<=n;i++){
d[i]=max((ll)0,d[i]-A-1+n)+max((ll)0,A-s+d[i]-1);
cout<<d[i]<<" ";
}
}
E - Little Elephant and LCM
题意
给你一个a序列,找出一个b序列,1 ≤ bi ≤ ai,使得max(bi)=lcm(bi),问这样的bi序列有多少个。
题解
找出序列中最大的数字i,枚举i=max(b[i]),对i因式分解,对于大于i的部分用快速幂相减,在运算的过程中很容易出现数字过大的情况,所以每做一次运算都要对100000007取模。
#include<bits/stdc++.h>
using namespace std;
const int mod=1e9+7;
long long int num[100000];
long long int powermod(long long int a,long long int b){
long long int ans=1;
while(b){
if(b&1) ans=ans*a%mod;
a=a*a%mod;
b=b/2;
}
return ans;
}
int main(){
long long int n;
long long int j;
long long int ans=0,basic;
cin>>n;
for(int i=1;i<=n;i++){
cin>>num[i];
}
sort(num+1,num+n+1);
for(int i=1;i<=num[n];i++){
vector <int> a;
for(j=1;j*j<=i;j++){
if(i%j==0){
a.push_back(j);
if(j*j!=i) a.push_back(i/j);
}
}
sort(a.begin(),a.end());
int b,c=1;
basic=1;
for(j=1;j<a.size();j++){
b=lower_bound(num+1,num+n+1,a[j])-num;
basic=basic*powermod(j,b-c)%mod;
basic=basic%mod;
c=b;
}
ans=(ans+basic*(((powermod(j,n-c+1)-powermod(j-1,n-c+1)+mod))%mod))%mod;
}
cout<<ans%mod;
}
总结
最终RANK:2
待提升
还是对于大数据的处理,D题被大数据卡了好几次,以后提交前应该看下大数据是否会爆掉。
FIGHTING!
2017年9月6日