T1
题解:
这其实就是一个很简单的模拟,大家使劲按要求模拟就OK
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define ll long long using namespace std; string C; string K; int KeyK,KeyC; bool dxx[1010]; int main(){ cin>>K; cin>>C; for(int i=0;i<K.size();i++){ if(K[i]>=97){ K[i]-=32; } } for(int i=0;i<C.size();i++){ if(C[i]>=97){ C[i]-=32; dxx[i]=1; } } while(KeyC!=C.size()){ char out; out=C[KeyC]-(K[KeyK]-'A'); if(out<'A'){ out+=26; } if(dxx[KeyC]){ cout<<(char)(out+32); } else cout<<out; KeyC++; KeyK++; if(KeyK==K.size()){ KeyK=0; } } }
T2
题解:这道题是一道贪心题,大家只需要找到贪心策略是左手与右手的乘积,然后从小到大sort一下就OK了;(不过大家有一点需要小小注意一下,需要打一个高精度,要不然就只有60了)
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define MAXN 10005 using namespace std; int a[10005],n,len,x,y; struct each{ long long a,b; }use[10005]; bool cmp(const each x,const each y){ return x.a*x.b < y.a*y.b; } void m(int x){ for(int i=1; i<=len; i++){ a[i]*=x; } for(int i=1; i<=len; i++){ if(a[i]>=10) { a[i+1]+=a[i]/10; a[i]%=10; } if(i==len&&a[i+1]!=0)len++; } } void d(int mod){ int rest=a[len]; int i; for(i=len-1; i>0; i--){ if(rest>=mod)break; rest=rest*10+a[i]; } if(rest<mod){ printf("1"); return; } while(i>0){ printf("%d",rest/mod); rest%=mod; rest=rest*10+a[i--]; } printf("%d",rest/mod); } int main(){ cin>>n>>x>>y; for(long long i=1; i<=n; i++){ scanf("%d%d",&use[i].a,&use[i].b); } sort(use+1,use+n+1,cmp); a[1]=x; len=1; for(int i=1; i<n; i++){ m(use[i].a); } d(use[n].b); return 0; }
T3
70分暴力
题解:倍增Dp提前预处理出一个点走2i2i后的情况,对于寻找第一近和第二近的房子可以用map进行维护,每次找到最近的几个点,最后直接模拟即可
![](https://images.cnblogs.com/OutliningIndicators/ContractedBlock.gif)
#include<bits/stdc++.h> #define ll long long #define inf 10000000000 using namespace std; ll n; ll X; ll H[100010]; ll wheA[100010][2]; ll wheB[100010][2]; ll s,m; long double ans1=inf; ll read(){ ll num=0,f=1; char ch; ch=getchar(); while(ch>'9'||ch<'0'){ if(ch=='-') f=-1; ch=getchar(); } while(ch<='9'&&ch>='0'){ num=(num<<3)+(num<<1)+ch-'0'; ch=getchar(); } return f*num; } long double dfs(ll S,ll x,bool who,ll AS,ll BS){ // if(AS+BS>S) return inf; if(x>=n){ if(BS==0){ return inf; } return (long double)AS/(long double)BS; } if(!who){ if(AS+wheA[x][1]+BS<=S){ return dfs(S,wheA[x][0],1,AS+wheA[x][1],BS); } } else { if(AS+wheB[x][1]+BS<=S){ return dfs(S,wheB[x][0],0,AS,BS+wheB[x][1]); } } if(BS==0){ return inf; } return (long double)AS/(long double)BS; } void dfs_(ll S,ll x,bool who,ll AS,ll BS){ if(x>=n){ printf("%lld %lld ",AS,BS); return; } if(!who){ if(AS+wheA[x][1]+BS<=S){ dfs_(S,wheA[x][0],1,AS+wheA[x][1],BS); return; } } else { if(AS+wheB[x][1]+BS<=S){ dfs_(S,wheB[x][0],0,AS,BS+wheB[x][1]); return; } } printf("%lld %lld ",AS,BS); } int main(){ n=read(); for(ll i=1;i<=n;i++){ H[i]=read(); } H[n+1]=inf; for(ll i=1;i<=n-1;i++){ ll x=i+1; ll y=i+2; ll t; if((abs(H[x]-H[i])>abs(H[y]-H[i]))||(((abs(H[x]-H[i])==abs(H[y]-H[i])))&&(H[y]-H[i]<0))) swap(x,y); for(ll j=i+3;j<=n;j++){ if((abs(H[x]-H[i])>abs(H[j]-H[i]))||(((abs(H[x]-H[i])==abs(H[j]-H[i])))&&(H[j]-H[i]<0))){ t=x; x=j; y=t; continue; } if(((abs(H[x]-H[i])<abs(H[j]-H[i]))&&(abs(H[j]-H[i])<abs(H[y]-H[i])))||((abs(H[j]-H[i])==abs(H[y]-H[i]))&&(H[j]-H[i]<0))){ y=j; continue; } } wheA[i][0]=y; wheA[i][1]=abs(H[y]-H[i]); wheB[i][0]=x; wheB[i][1]=abs(H[x]-H[i]); } X=read(); for(ll i=1;i<n;i++){ long double w=dfs(X,i,0,0,0); if(ans1>w||(ans1==w&&H[i]>H[s])){ ans1=w; s=i; } } printf("%lld ",s); m=read(); while(m--){ int a,b; a=read(); b=read(); dfs_(b,a,0,0,0); } }