题1:平面内有n个矩形, 第i个矩形的左下角坐标为(x1[i], y1[i]), 右上角坐标为(x2[i], y2[i])。
如果两个或者多个矩形有公共区域则认为它们是相互重叠的(不考虑边界和角落)。
请你计算出平面内重叠矩形数量最多的地方,有多少个矩形相互重叠。
思路:把坐标离散化之后直接统计(当时通过率90%)
#include
#include
#include
using namespace std;
int main(){
const int N=500;
int x1[N],y1[N],x2[N],y2[N],s[N],f[N][N];
map<int,int> mp;
mp.clear();
for (int i=0; ifor (int j=0; j0;
int n;
scanf("%d",&n);
for (int i=0; iscanf("%d",&x1[i]),s[i]=x1[i];
for (int i=0; iscanf("%d",&y1[i]),s[n+i]=y1[i];
for (int i=0; iscanf("%d",&x2[i]),s[2*n+i]=x2[i];
for (int i=0; iscanf("%d",&y2[i]),s[3*n+i]=y2[i];
int c=0;
sort(s,s+4*n);
for (int i=0; i<4*n; i++){
if (mp.count(s[i])==0){
mp[s[i]]=c++;
}
}
for (int i=0; iif (x1[i]>x2[i]) swap(x1[i],x2[i]);
if (y1[i]>y2[i]) swap(y1[i],y2[i]);
for (int a=mp[x1[i]]; a<=mp[x2[i]]; a++)
for (int b=mp[y1[i]]; b<=mp[y2[i]]; b++) f[a][b]++;
}
int ans=0;
for (int i=0; ifor (int j=0; jprintf("%d\n",ans);
return 0;
}
题2:牛牛以前在老师那里得到了一个正整数数对(x, y), 牛牛忘记他们具体是多少了。
但是牛牛记得老师告诉过他x和y均不大于n, 并且x除以y的余数大于等于k。
牛牛希望你能帮他计算一共有多少个可能的数对。
思路:枚举y(当心k=0的情况,当时没考虑,80%通过率)
#include
#include
using namespace std;
int main()
{
long long n,k;
cin>>n>>k;
long long ans=0;
for(int y=max(1LL,k);y<=n;++y)
{
int res=0;
res=n/y*(y-k);
if(n%y>=k)
if(k)
res+=n%y-k+1;
else res+=n%y;
ans+=res;
}
cout<
题3:为了找到自己满意的工作,牛牛收集了每种工作的难度和报酬。牛牛选工作的标准是在难度不超过自身能力值的情况下,牛牛选择报酬最高的工作。在牛牛选定了自己的工作后,牛牛的小伙伴们来找牛牛帮忙选工作,牛牛依然使用自己的标准来帮助小伙伴们。牛牛的小伙伴太多了,于是他只好把这个任务交给了你。
思路:简单的背包
#include
#include
using namespace std;
typedef pair<int,int>pii;
const int N=100010;
pii dat[N],a[N];
int ans[N];
void solve(){
int n,m;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++) scanf("%d%d",&dat[i].first,&dat[i].second);
sort(dat+1,dat+n+1);
for(int i=1;i<=m;i++) scanf("%d",&a[i].first),a[i].second=i;
sort(a+1,a+m+1);
int cur=0;
for(int i=1,j=1;j<=m;j++){
while(i<=n && dat[i].first<=a[j].first){
cur=max(cur,dat[i].second);
i++;
}
ans[a[j].second]=cur;
}
for(int i=1;i<=m;i++) printf("%d\n",ans[i]);
}
int main(){
solve();
return 0;
}