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\n",ans);
	return 0;
}
posted @ 2019-10-08 15:16  设计涉及社稷  阅读(116)  评论(0编辑  收藏  举报