若需要交换两个变量的值,除了通常使用的借用中间变量进行交换外,还可以利用异或,仅使用两个变量进行交换,如:
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;
}