noip2012day1

T1

题解:
这其实就是一个很简单的模拟,大家使劲按要求模拟就OK

#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;
       }
   }
}
View Code

T2

题解:这道题是一道贪心题,大家只需要找到贪心策略是左手与右手的乘积,然后从小到大sort一下就OK了;(不过大家有一点需要小小注意一下,需要打一个高精度,要不然就只有60了)

#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;
}
View Code

T3

70分暴力

题解:倍增Dp提前预处理出一个点走2i2i后的情况,对于寻找第一近和第二近的房子可以用map进行维护,每次找到最近的几个点,最后直接模拟即可

#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);
   }
}
View Code

  

原文地址:https://www.cnblogs.com/Heartbeat358/p/12640507.html