A:Dead Pixel
题意:窗口中有一个坏点,求不包含坏点的最大矩形窗口面积。
题解:遍历被坏点分割的四个矩形区域取最大值即可。
Accept Code:
#include <bits/stdc++.h> using namespace std; int main(){ int t; cin>>t; while(t--){ int a,b,x,y; cin>>a>>b>>x>>y; int res=0; res=max(res,a*(b-y-1)); res=max(res,b*(a-x-1)); res=max(res,a*y); res=max(res,b*x); cout<<res<<" "; } return 0; }
B
题意:一条n个路口的路,每个路口有AB两种类型,对于i~j区间中,若所有值都相同,即可花费a或b从i到达j+1.现在总共有p的钱,问最小从哪个点开始可以到达第n个路口。
就是必须走到n点停止,所以我们应该在n-1那过来,不能有一个abbb,你直接做b的车直接到n+1,同时他要求后面一段
一定要坐车不走路;所以倒模拟,能坐车就做,不能就退出来
C
:给定一个序列b。求是否存在最小的1~2n的排列a满足bi=min(ai*2-1,ai*2)。
#include <bits/stdc++.h> using namespace std; const int maxn=110; int a[maxn],b[maxn]; bool vis[maxn<<1]; void solve(){ memset(vis,false,sizeof vis); int n; cin>>n; for(int i=1;i<=n;i++) { cin >> b[i]; vis[b[i]]=true; } for(int i=1;i<=n;i++){ a[i*2-1]=b[i]; bool flag=false; for(int j=b[i]+1;j<=n*2;j++){ if(vis[j])continue; vis[j]=true; a[i*2]=j; flag=true; break; } if(!flag){ cout<<"-1 "; return; } } for(int i=1;i<=2*n;i++){ cout<<a[i]<<" "; } cout<<" "; } int main(){ int t; cin>>t; while(t--){ solve(); } return 0; }
D
给定所有书籍的本数以及增加1本所需消费。求最小花费使得所有书籍数量不同。
题解:首先我们肯定是先按数量从小排到大,主要矛盾就是在数量相同的时候改怎么办,假设刺客有n个数量为x的书籍,将他们按发花费为x
那么我们是不是将n-1个数量为x++,然后留下一个花费最高的x在原地保持;我们用multiset容器存进来