• 3.22


    若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:

    void swap(int &a,int &b)
    {
        a=a^b;
        b=b^a;
        a=a^b;
    }
    

    详解:

    a1=a^b
    b=b^a1=b^a^b=a
    //此时a1=a^b  b=a
    a=a1^b=a^b^a=b
    

    综上:同一变量与另一变量和其异或值异或等于另一个数,如(ab)b=a。
    用例:可使用于加密算法某一环节或更多环节,使算法更复杂,不易被破解,安全性更高。


    垃圾陷阱

    应该看得出就是一个背包吧!把垃圾的高度看成物重,能增加的生命的长短看成价值,然后把井的高度看成包的大小,要求必须把包填满(或爆)能取得的最小价值。

    设dp[i][j]表示前i个垃圾(注意一定要先按垃圾出现时间排序好),到达高度j时所拥有的最长的生命时间。

    那么dp[i][j]=max(dp[i][j],dp[i-1][j]+a[i].v-(a[i].t-a[i-1].t))(吃,不填)

    dp[i][j]=max(dp[i][j],dp[i-1][j-a[i].h]-(a[i].t-a[i-1].t))(不吃,填)

    如果有一个dp[i][j]>=0且j+a[i].h>=D,那么就走出去了,

    不然就是在dp[i][0]+a[i].t中取个最大值就好了。

    搞一个滚动数组优化一下空间:)。

    #include<bits/stdc++.h> 
    #define rep(i,a,b) for(int i=a;i<=b;++i)
    #define dwn(i,a,b) for(int i=a;i>=b;--i)
    #define X (c^48)
    #define C c=getchar()
    using namespace std;
    template <typename T> void inline rd(T&x){char c;int f=1;while(!isdigit(C))if(c=='-')f=-1;x=X;while(isdigit(C))x=x*10+X;x*=f;}
    void wr(int x){if(x<0){putchar('-');x=-x;}if(x>9)wr(x/10);putchar(x%10+'0');}
    #define INF 0x3f3f3f3f
    #define N 1010
    
    struct Rubbish{
    	int t,v,h;
    	bool operator <(const Rubbish &ab)const{return t<ab.t;} 
    }a[N];
    int dp[2][N],n,H;
    
    int main()
    {
    	freopen("read.txt","r",stdin);
    	rd(H),rd(n);
    	rep(i,1,n)rd(a[i].t),rd(a[i].v),rd(a[i].h);
        sort(a+1,a+n+1);
        dp[0][0]=10;
        int ans=-INF;
        rep(i,1,n)
    	{
            int cur=i&1,pre=cur^1;
            memset(dp[cur],~0x3f,sizeof(dp[cur]));
            dwn(j,H,0)
    		{
    			if(dp[pre][j]<a[i].t-a[i-1].t)continue;
    			if(j+a[i].h>=H)
    			{
    				printf("%d",a[i].t);
    				return 0;
    			}
    			dp[cur][j+a[i].h]=max(dp[cur][j+a[i].h],dp[pre][j]-(a[i].t-a[i-1].t));//不吃,填 
    			dp[cur][j]=max(dp[cur][j],dp[pre][j]+a[i].v-(a[i].t-a[i-1].t)); //吃,不填 
            }
        	ans=max(ans,dp[cur][0]+a[i].t);
        }
        printf("%d",ans);
        return 0;
    }
    

    P1187 3D模型

    因为0<=高度<=9,太小了,直接打表,算出高度为i的表面积,加入答案,

    但是这样算肯定算重复了。考虑重复部分即是第a[i][j]a[i+1][j]a[i][j+1]的分别取较小值,ans-=较小值*2(因为俩块都被重复算了两次)

    只考虑右边和下边既简单又做到了不重不漏

    • scanf("%1d",&a[i;[j]//如何输入一位数字
    const int biao[]={0,6,10,14,18,22,26,30,34,38};
    
    int a[1010][1010];
    int ans=0,n,m;
    
    int main(){
    	rd(n),rd(m);
    	rep(i,1,n)
    		rep(j,1,m){
    			scanf("%1d",&a[i][j]);
    			ans+=biao[a[i][j]];
    		}
    	rep(i,1,n)
    		rep(j,1,m){
    			if(i==n && j==m)continue;
    			ans-=(min(a[i][j],a[i+1][j])+min(a[i][j],a[i][j+1]))*2;
    		}
    	printf("%d
    ",ans);
    	return 0;
    }
    
  • 相关阅读:
    windows10关闭更新,windowsUpdate禁用无效 windows无限重启 一分钟无限重启 win10无法连接到SENS服务
    Visual Studio项目/解决方案重命名
    关于Geometry中的一些简单形状
    无法打开http://localhost:6080/arcgis/manager/
    centOS无法联网
    FTP服务器搭建
    iFrame中dateGrid中数据不显示
    关于python的基础知识
    python中int str bool list dict数据操作方法汇总
    关于int str bool的讨论
  • 原文地址:https://www.cnblogs.com/sjsjsj-minus-Si/p/11635563.html
Copyright © 2020-2023  润新知