来自一次考试(2019.4.21)

这是一道考试题。。。。。。

这篇博客只是用来存代码的。。。

T1

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 #define ll long long
 4 template<typename type_>
 5 void scan(type_ &x){
 6     type_ f=1;x=0;char s=getchar();
 7     while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
 8     while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
 9     x*=f;
10 }
11 ll a[200007],m,n,q,s,t,sum[200007];
12 
13 //void da(ll x,ll y){
14 //    m[x]=m[x-1]-s*y;
15 //    return ;
16 //}
17 //void xi(ll x,ll y){
18 //    m[x]=m[x-1]+t*y;
19 //    return ;
20 //}
21 //void xg(ll l,ll r,ll k){
22 //    for(int i=l;i<=r;i++){
23 //        a[i]+=k;
24 //    }
25 //    for(int i=1;i<=n;i++){
26 //        if(a[i]>a[i-1]){
27 //            da(i,a[i]-a[i-1]);
28 //        }else{
29 //            xi(i,a[i-1]-a[i]);
30 //        }
31 //    }
32 //    printf("%d\n",m[n]);
33 //    for(int i=l;i<=r;i++){
34 //        a[i]-=k;
35 //    }
36 //    memset(m,0,sizeof(m));
37 ////    cout<<"a=";
38 ////    for(int i=1;i<=n;i++){
39 ////        printf("%d ",a[i]);
40 ////    }
41 ////    cout<<"m= ";
42 ////    for(int i=1;i<=n;i++){
43 ////        printf("%d ",m[i]);
44 ////    }
45 ////    printf("\n");
46 ////    printf("%lld\n",m[n]);
47 //}
48 
49 
50 int main(){
51     freopen("365.in","r",stdin);
52     freopen("365.out","w",stdout);
53     scan(n);scan(q);scan(s);scan(t);
54     for(int i=0;i<=n;i++){
55         scan(a[i]);
56         if(i==0)continue;
57         if(a[i]>a[i-1]){
58             sum[i]=-1*(s*(a[i]-a[i-1]));
59         }else{
60             sum[i]=t*(a[i-1]-a[i]);
61         }
62 //        scanf("%lld",&a[i]);
63     }
64     for(int i=1;i<=n;i++){
65         m+=sum[i];
66 //        sum1[i]=sum[i];
67     }
68     for(int j=1;j<=q;j++){
69         ll lll,rr,kk,ans1=0,ans2=0;
70         scan(lll);scan(rr);scan(kk);
71 //        scanf("%lld%lld%lld",&lll,&rr,&kk);
72 //        if(rr==n)continue;
73         if(a[lll]+kk>a[lll-1]){
74             ans1=sum[lll]-(-1*s*(a[lll]+kk-a[lll-1]));
75         }else{
76             ans1=sum[lll]-(t*(a[lll-1]-a[lll]-kk));
77         }
78         if(a[rr+1]>a[rr]+kk){
79             ans2=sum[rr+1]-(-1*s*(a[rr+1]-a[rr]-kk));
80         }else{
81             ans2=sum[rr+1]-t*(a[rr]-a[rr+1]+kk);
82         }
83         if(rr==n)ans2=0;
84         printf("%lld\n",m-ans1-ans2);
85     }
86     return 0;
87 }

 

T3

代码:

 1 #include<bits/stdc++.h>
 2 using namespace std;
 3 //#define ll long long
 4 template<typename type>
 5 void scan(type &x){
 6     type f=1;x=0;char s=getchar();
 7     while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();}
 8     while(s>='0'&&s<='9'){x=x*10+s-'0';s=getchar();}
 9     x*=f;
10 }
11 int n,m,a[2007][2007];
12 int gmax,gmin;
13 int check(int ch){
14     int ss=0;
15     for(int i=0;i<n;i++){
16         for(int j=0;j<m;j++){
17             if(a[i][j]<gmax-ch){
18                 ss=max(ss,j+1);//求出有最大值的图的边界 
19             }
20         }
21         for(int j=0;j<m;j++){
22             if(a[i][j]>ch+gmin){
23                 if(j<ss)return 0;//判断最大值与最小值的图的边界是否冲突
24                 //即判断图是否联通 
25             }
26         }
27     }
28     return 1;//题目条件判断 
29 }
30 int erfen(){
31     int l=0,r=gmax-gmin;
32     while(l<r){
33         int mid=(l+r)/2;
34         if(check(mid)){//如果这个值不满足条件 
35             r=mid;//更新 
36         }else{
37             l=mid+1;
38         }
39     }
40     return l;//返回最小值 
41 }
42 
43 
44 int main(){
45     freopen("paint.in", "r", stdin);
46     freopen("paint.out", "w", stdout);
47     scan(n);scan(m);
48     for(int i=0;i<n;i++){
49         for(int j=0;j<m;j++){
50             scan(a[i][j]);
51         }
52     }
53 
54     gmax=gmin=a[0][0];
55     for(int i=0;i<n;i++){
56         for(int j=0;j<m;j++){
57             gmax=max(gmax,a[i][j]);
58             gmin=min(gmin,a[i][j]);//求出全图最大值 
59         }
60     } 
61     int ans;
62     ans=erfen();//求出原图的最小答案 
63     for(int i=0;i<n/2;i++){
64         for(int j=0;j<m;j++){
65             swap(a[i][j],a[n-i-1][j]);
66         }//将图左右对称,即将出发点放到右上角。 
67     }
68     ans=min(ans,erfen());
69     for(int i=0;i<n;i++){
70         for(int j=0;j<m/2;j++){
71             swap(a[i][j],a[i][m-j-1]);
72         }//将图上下对称,即将出发点放到右下角。 
73     }
74     ans=min(ans,erfen());
75     for(int i=0;i<n/2;i++){
76         for(int j=0;j<m;j++){
77             swap(a[i][j],a[n-i-1][j]);
78         }//再次左右对称,将出发点放到左下角。 
79     }
80     ans=min(ans,erfen());
81     printf("%d\n",ans);
82     return 0;
83 }

 

 

posted @ 2019-04-23 17:41  惜时如金  阅读(124)  评论(0编辑  收藏  举报