【EOJ Monthly 2018.2 (Good bye 2017)】
23333333333333333
由于情人节要回家,所以就先只放代码了。
此题是与我胖虎过不去。
【E. 出老千的 xjj】
#include<cstdio> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> using namespace std; const int maxn=3000000; #define ll long long int i,j,n,k,x; ll p[maxn+10],sum[maxn+10],tmp,ans=100000000000000000,Max=0; int main() { scanf("%d%d",&n,&k); for(i=1;i<=n;i++){ scanf("%d",&x); tmp+=x; p[x]++; } if(tmp<=k){ printf("0\n"); return 0; } for(i=1;i<=maxn;i++) { sum[i]=sum[i-1]+p[i]*i; p[i]+=p[i-1]; } for(i=2;i<=maxn;i++){ ll yy=(k-1)/i+1; ll xx=n; tmp=0; //if(k%i==0&&yy<xx) continue; if(k%i==0) continue; //上面的WA了 for(j=0;j<maxn/i;j++){ int n1=(j+1)*i,n2=j*i+1; if(n2<0) n2=0; xx+=(p[n1]-p[n2-1]); tmp+=(p[n1]-p[n2-1])*((j+1)*i)-sum[n1]+sum[n2-1]; if(k%i==0&&yy<xx) break; if(tmp>ans) break; } if((k%i==0&&xx<=yy)||k%i!=0){ ans=min(ans,tmp); } } cout<<ans<<endl;; return 0; }
【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[6]={100,50,20,10,5,1},cost[15]; long long f[110]; int main(){ scanf("%d%d%d",&n,&k,&p); for(int i=1;i<=k;i++){ long long temp=1LL*i*p; for(int j=0;j<=5;j++) if(temp>=num[j]){ cost[i]+=temp/num[j]; temp%=num[j]; } } memset(f,10,sizeof(f)); f[0]=0; for(int i=1;i<=100;i++) for(int j=max(0,i-k);j<i;j++) f[i]=min(f[i],f[j]+cost[i-j]); if(n<=100){ cout<<f[n]<<endl; return 0; } int way=1; for(int i=2;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=1;i<=100;i++){ t1=n/way-i; t2=n-way*t1; ans=min(ans,1LL*t1*cost[way]+f[t2]); } cout<<ans<<endl; return 0; }
【B】
#include<iostream> #include<cstdio> #include<cstring> #include<ctime> #include<cstdlib> #include<algorithm> #include<cmath> #include<string> using namespace std; int N,sta[25]; int f[1100000]; struct edge{ int x,y; }e[25]; int have[25][25],cnt[25]; int check(int x,int s){ bool flag=0; for(int i=1;i<=cnt[x];i++) if(s&sta[have[x][i]]){ flag=1; break; } if(!flag) return -1; for(int i=1;i<=cnt[x];i++) if(s&sta[have[x][i]]) s^=sta[have[x][i]]; return s; } int dfs(int s){ if(f[s]!=-1) return f[s]; for(int i=1;i<=N;i++){ int temp=check(i,s); if(temp!=-1) if(!dfs(temp)) return f[s]=1; } return f[s]=0; } int main(){ sta[0]=1; for(int i=1;i<=20;i++) sta[i]=sta[i-1]*2; scanf("%d",&N); for(int i=0;i<N-1;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,-1,sizeof(f)); f[0]=0; if(dfs(sta[N-1]-1)) printf("First\n"); else printf("Second\n"); return 0; }
【F】
#include<cstdio> #include<cstdlib> #include<iostream> using namespace std; const int maxn=10010; 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<=0||b<=0||c<=0) printf("Wrong\n"); else printf("%.6lf\n",a); } return 0; }
It is your time to fight!