标签:ret 怎样 个数 暴力 abs bit 观察 efi 一个
水题,考虑正数,负数个数是否\(\geq \lceil \frac{n}{2} \rceil\)
所以我们只需min(蛋糕i到蛋糕i+1),然后累计即可;即处理每种蛋糕位置,然后处理min(abs(cake[i].a-cake[i+1].a)+abs(cake[i].b-cake[i+1].b),abs(cake[i].a-cake[i+1].b)+abs(cake[i].b-cake[i+1].a))
dfs位置(r1,c1)连通的区域,将位置存起来;dfs位置(r2,c2);然后暴力找吧
3.之所以1是最优选择是因为可以将需要运到最近地方的糖留在了最后,所以我们只需要对每个站点处理需运到最近地方的糖果
#include <bits/stdc++.h>
using namespace std;
//author:fridayfang
//date:19 2月 26
//global varibles
#define ll long long;
#define inf 0x3f3f3f3f
#define CL(a,b) memset(a,b,sizeof(a))
#define sf(a) scanf("%d",&a)
#define pr(a) printf("%d\n",a)
#define db(a) printf("db %d\n",a)
#define fr0(i,m) for(int i=0;i<m;i++)
#define fr1(i,m) for(int i=1;i<=m;i++)
const int maxn = 5000 + 5;
const int maxm = 20000+5;
int dis[maxn];//记录源站点到目的站点最近的距离
int num[maxn];//记录站点糖的数量;
//从站点i除法运完站点j的糖的时间
//(j-i+n)%n+n*(num[j]-1)+dis[j]
//枚举j得到最大时间则是所求
int n,m;
int main(){
sf(n),sf(m);
fr1(i,m){
int a,b;
sf(a),sf(b);
if(num[a]){
dis[a]=min(dis[a],(b-a+n)%n);
}
else dis[a]=(b-a+n)%n;
num[a]++;
}
fr1(i,n){
int ans=0;
fr1(j,n){
ans=max(ans,(j-i+n)%n+n*(num[j]-1)+dis[j]);
}
printf("%d ",ans);
}
return 0;
}
然后进行分配
#include<bits/stdc++.h>
using namespace std;
#define fr0(i, m) for(int i=0;i<m;i++)
//构造题
int k;
int ans[2004];
int a[2000];
int main(){
ans[2]=-1;
scanf("%d",&k);
//寻找n
int n;
for(n=2;n<=2000;n++){
if((1002000+k)<=(n-1)*1000000) break;
}
int x=(n+k)/(n-2);
//printf("db %d %d\n",x,n);
printf("%d\n",n);
for(int i=0;i<n;i++){
if(i==0) a[0]=-1;
else if(i==n-1){
a[i]=n+k-x*(n-2);
//printf(" %d",n+k-x*(n-2));
}
else{
a[i]=x;
}
}
fr0(i,n){
printf("%d ",a[i]);
}
return 0;
}
Codeforces Round #542 (Div. 2)
标签:ret 怎样 个数 暴力 abs bit 观察 efi 一个
原文地址:https://www.cnblogs.com/fridayfang/p/10439229.html