A题有点水,但是花了10分钟才a掉,把%10的先加一,处理成字符串再减一
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=5000+10,maxn=1000000+10,inf=0x3f3f3f; int main() { ios::sync_with_stdio(false); cin.tie(0); string s=""; for(int i=1;i<1000;i++) { string t=""; int p=i; if(p%10==0)p+=1; while(p) { t+=(char)(p%10+'0'); p/=10; } reverse(t.begin(),t.end()); if(i%10==0)t[t.size()-1]='0'; s+=t; } int n; cin>>n; cout<<s[n-1]<<endl; return 0; } /******************** ********************/
B题长度大于26就不行,其他的就全处理成不同字符就行了
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=5000+10,maxn=1000000+10,inf=0x3f3f3f; bool vis[30]; int main() { ios::sync_with_stdio(false); cin.tie(0); string s; int n; cin>>n>>s; if(s.size()>26)cout<<-1<<endl; else { memset(vis,0,sizeof vis); int ans=0; for(int i=0;i<s.size();i++) if(!vis[s[i]-'a']) { ans++; vis[s[i]-'a']=1; } cout<<s.size()-ans<<endl; } return 0; } /******************** ********************/
C题,一开始的思路是对的,但是没有考虑到只有一个人捡垃圾的情况,就是找最大的能节省的路程(垃圾桶到垃圾的距离-人到垃圾桶的距离)(分别枚举一下a,b)
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define C 0.5772156649 #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=100000+10,maxn=1000000+10,inf=0x3f3f3f; double x[N],y[N]; double dis(double x1,double y1,double x2,double y2) { return sqrt((x1-x2)*(x1-x2)+(y1-y2)*(y1-y2)); } int main() { ios::sync_with_stdio(false); cin.tie(0); cout<<setiosflags(ios::fixed)<<setprecision(12); double ax,ay,bx,by,tx,ty; cin>>ax>>ay>>bx>>by>>tx>>ty; int n; cin>>n; for(int i=1;i<=n;i++)cin>>x[i]>>y[i]; if(n==1) { double ans=min(dis(x[1],y[1],ax,ay),dis(x[1],y[1],bx,by)); cout<<ans+dis(x[1],y[1],tx,ty)<<endl; return 0; } double max1=-2e9,max2=-2e9; int id1=0,id2=0; for(int i=1;i<=n;i++) { double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],ax,ay); if(te>max1) { max1=te; id1=i; } } for(int i=1;i<=n;i++) { if(i==id1)continue; double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],bx,by); if(te>max2) { max2=te; id2=i; } } double p=max(max1+max2,max(max1,max2)); max1=max2=-2e9; id1=id2=0; for(int i=1;i<=n;i++) { double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],bx,by); if(te>max1) { max1=te; id1=i; } } for(int i=1;i<=n;i++) { if(i==id1)continue; double te=dis(x[i],y[i],tx,ty)-dis(x[i],y[i],ax,ay); if(te>max2) { max2=te; id2=i; } } p=max(p,max(max1+max2,max(max1,max2))); double ans=0; for(int i=1;i<=n;i++)ans+=2*dis(x[i],y[i],tx,ty); cout<<ans-p<<endl; return 0; } /******************** 1 ********************/
D题,思路完全不对啊,想去二分差值,但是处理太麻烦了,正解是二分完成后的最大值,最小值
注意处理上下界的问题,先求平均数,如果平均数是整数,那么上下界都是它,否则,下界应该是平均数+1
#include<map> #include<set> #include<cmath> #include<queue> #include<stack> #include<vector> #include<cstdio> #include<cassert> #include<iomanip> #include<cstdlib> #include<cstring> #include<iostream> #include<algorithm> #define pi acos(-1.0) #define ll long long #define mod 1000000007 #define ls l,m,rt<<1 #define rs m+1,r,rt<<1|1 #pragma comment(linker, "/STACK:1024000000,1024000000") using namespace std; const double g=10.0,eps=1e-7; const int N=500000+10,maxn=500+100,inf=0x3f3f3f; ll c[N],n,k,te[N]; bool ok1(ll x) { ll ans=0; for(int i=1;i<=n;i++) if(c[i]<x) ans+=x-c[i]; return ans<=k; } bool ok2(ll x) { ll ans=0; for(int i=1;i<=n;i++) if(c[i]>x) ans+=c[i]-x; return ans<=k; } int main() { ios::sync_with_stdio(false); cin.tie(0); cin>>n>>k; ll sum=0; for(int i=1;i<=n;i++) { cin>>c[i]; sum+=c[i]; } ll R,L; if(sum%n==0)L=R=sum/n; else L=sum/n,R=sum/n+1; sort(c+1,c+1+n); ll l=0,r=L+1; while(l<r-1) { ll m=(l+r)/2; if(ok1(m))l=m; else r=m; } ll ans1=l; l=R-1,r=1e9; while(l<r-1) { ll m=(l+r)/2; if(ok2(m))r=m; else l=m; } cout<<r-ans1<<endl; return 0; } /********************* *********************/