23333333333333333

由于情人节要回家,所以就先只放代码了。

此题是与我胖虎过不去。

【E. 出老千的 xjj】

#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=;
#define ll long long
int i,j,n,k,x;
ll p[maxn+],sum[maxn+],tmp,ans=,Max=;
int main()
{
scanf("%d%d",&n,&k);
for(i=;i<=n;i++){
scanf("%d",&x);
tmp+=x;
p[x]++;
}
if(tmp<=k){
printf("0\n");
return ;
}
for(i=;i<=maxn;i++) {
sum[i]=sum[i-]+p[i]*i;
p[i]+=p[i-];
}
for(i=;i<=maxn;i++){
ll yy=(k-)/i+;
ll xx=n;
tmp=;
//if(k%i==0&&yy<xx) continue;
if(k%i==) continue; //上面的WA了
for(j=;j<maxn/i;j++){
int n1=(j+)*i,n2=j*i+;
if(n2<) n2=;
xx+=(p[n1]-p[n2-]);
tmp+=(p[n1]-p[n2-])*((j+)*i)-sum[n1]+sum[n2-];
if(k%i==&&yy<xx) break;
if(tmp>ans) break;
}
if((k%i==&&xx<=yy)||k%i!=){
ans=min(ans,tmp);
}
}
cout<<ans<<endl;;
return ;
}

【A2】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int n,k,p;
int num[]={,,,,,},cost[];
long long f[];
int main(){
scanf("%d%d%d",&n,&k,&p);
for(int i=;i<=k;i++){
long long temp=1LL*i*p;
for(int j=;j<=;j++)
if(temp>=num[j]){
cost[i]+=temp/num[j];
temp%=num[j];
}
}
memset(f,,sizeof(f));
f[]=;
for(int i=;i<=;i++)
for(int j=max(,i-k);j<i;j++)
f[i]=min(f[i],f[j]+cost[i-j]);
if(n<=){
cout<<f[n]<<endl;
return ;
}
int way=;
for(int i=;i<=k;i++)
if(1.0*i/cost[i]>1.0*way/cost[way])
way=i;
int t1=n/way,t2=n%way;
long long ans=1LL*t1*cost[way]+f[t2];
for(int i=;i<=;i++){
t1=n/way-i;
t2=n-way*t1;
ans=min(ans,1LL*t1*cost[way]+f[t2]);
}
cout<<ans<<endl;
return ;
}

【B】

#include<iostream>
#include<cstdio>
#include<cstring>
#include<ctime>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<string>
using namespace std;
int N,sta[];
int f[];
struct edge{
int x,y;
}e[];
int have[][],cnt[];
int check(int x,int s){
bool flag=;
for(int i=;i<=cnt[x];i++)
if(s&sta[have[x][i]]){
flag=;
break;
}
if(!flag)
return -;
for(int i=;i<=cnt[x];i++)
if(s&sta[have[x][i]])
s^=sta[have[x][i]];
return s;
}
int dfs(int s){
if(f[s]!=-)
return f[s];
for(int i=;i<=N;i++){
int temp=check(i,s);
if(temp!=-)
if(!dfs(temp))
return f[s]=;
}
return f[s]=;
}
int main(){
sta[]=;
for(int i=;i<=;i++)
sta[i]=sta[i-]*;
scanf("%d",&N);
for(int i=;i<N-;i++){
scanf("%d%d",&e[i].x,&e[i].y);
have[e[i].x][++cnt[e[i].x]]=i;
have[e[i].y][++cnt[e[i].y]]=i;
}
memset(f,-,sizeof(f));
f[]=;
if(dfs(sta[N-]-))
printf("First\n");
else
printf("Second\n");
return ;
}

【F】

#include<cstdio>
#include<cstdlib>
#include<iostream>
using namespace std;
const int maxn=;
int main()
{
int T;
double a,b,c,x,y,z;
while(~scanf("%lf%lf%lf",&x,&y,&z)){
a=(2.0*y-z+x)/2.0;
b=x-a;
c=(z-a-b)/2.0;
if(a<=||b<=||c<=) printf("Wrong\n");
else printf("%.6lf\n",a);
} return ;
}
05-22 16:35