2020HDU多校第四场By Rynar 6802-6813
1001.Anti-AK Problem
1002.Blow up the Enemy
int main(){
int T,x,y;
scanf("%d",&T);
while (T--){
int n;
scanf("%d",&n);
int mi=1e9,cnt=0,t;
for (int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
t=((100+x-1)/x-1)*y;
if (mi>t)mi=t,cnt=1;
else if (mi==t)cnt++;
}
printf("%lf\n",(cnt*0.5+n-cnt)/n);
}
return 0;
}
1003.Contest of Rope Pulling
typedef long long ll;
const ll inf=1e16;
const int N=1e3+10;
const int M=1e6+10;
ll n,m;
ll f1[M],f2[M];
struct node{
int w,v;
friend bool operator<(const node &a,const node &b){
return a.w<b.w;
}
}a[N],b[N];
int main(){
ll T,x,y;
scanf("%d",&T);
while (T--){
scanf("%d%d",&n,&m);
ll m1=0,m2=0;
for (int i=1;i<=n;i++){
scanf("%d%d",&a[i].w,&a[i].v);
m1+=a[i].w;
}
for (int i=1;i<=m;i++){
scanf("%d%d",&b[i].w,&b[i].v);
m2+=b[i].w;
}
sort(a+1,a+1+n);
sort(b+1,b+1+m);
ll mm=min(m1,m2);
for (int i=1;i<=mm;i++)f1[i]=f2[i]=-inf;
f1[0]=f2[0]=0;
ll sumw=0;
for(int i=1;i<=n;i++){
sumw+=a[i].w;
for(int c=sumw;c>=a[i].w;c--){
if (f1[c-a[i].w]!=-inf&&f1[c]<f1[c-a[i].w]+a[i].v)
f1[c]=f1[c-a[i].w]+a[i].v;
}
}
sumw=0;
for(int i=1;i<=m;i++){
sumw+=b[i].w;
for(int c=sumw;c>=b[i].w;c--){
if (f2[c-b[i].w]!=-inf&&f2[c]<f2[c-b[i].w]+b[i].v)
f2[c]=f2[c-b[i].w]+b[i].v;
}
}
ll mx=0;
for (int i=1;i<=mm;i++){
if (mx<f1[i]+f2[i])
mx=f1[i]+f2[i];
}
printf("%lld\n",mx);
}
return 0;
}
1004.Deliver the Cake
typedef long long ll;
typedef pair<ll,ll>P;
const ll inf=1e16;
const int N=1e5+10;
ll n,m,k;
char sss[N];
ll c[N][3],ss[N];
vector<P>v[N];
ll dijkstra(ll x,ll y){
for (int i=1;i<=n;i++)for (int j=1;j<=2;j++)c[i][j]=inf;
priority_queue< P , vector<P> , greater<P> > q;
if (ss[x]!=0)q.push({0*1ll,x}),c[x][ss[x]]=0;
else q.push({0*1ll,x}),c[x][2]=0,c[x][1]=0;
while(!q.empty()){
P r=q.top();
q.pop();
int u=r.second;
if (c[u][1]<r.first&&c[u][2]<r.first)continue;
for (P i:v[u]){
ll to=i.first,d=i.second;
if (ss[to]==1){
if(c[u][1]+d<c[to][1]){
c[to][1]=c[u][1]+d;q.push({c[to][1],to});
}
if(c[u][2]+d+k<c[to][1]){
c[to][1]=c[u][2]+d+k;q.push({c[to][1],to});
}
}
else if (ss[to]==2){
if(c[u][1]+d+k<c[to][2]){
c[to][2]=c[u][1]+d+k;q.push({c[to][2],to});
}
if(c[u][2]+d<c[to][2]){
c[to][2]=c[u][2]+d;q.push({c[to][2],to});
}
}
else if (ss[to]==0){
if(c[u][1]+d<c[to][1]){
c[to][1]=c[u][1]+d;q.push({c[to][1],to});
}
if(c[u][2]+d+k<c[to][1]){
c[to][1]=c[u][2]+d+k;q.push({c[to][1],to});
}
if(c[u][1]+d+k<c[to][2]){
c[to][2]=c[u][1]+d+k;q.push({c[to][2],to});
}
if(c[u][2]+d<c[to][2]){
c[to][2]=c[u][2]+d;q.push({c[to][2],to});
}
}
}
}
return min(c[y][1],c[y][2]);
}
void add(int x,int y,int z){
v[x].push_back({y,z});v[y].push_back({x,z});
}
int main(){
int T;
scanf("%d",&T);
ll s,t,x,y,z;
while (T--){
scanf("%lld%lld%lld%lld%lld",&n,&m,&s,&t,&k);
for (int i=1;i<=n;i++)v[i].clear();
scanf("%s",sss+1);
for (int i=1;i<=n;i++){
if (sss[i]=='M')ss[i]=0;
if (sss[i]=='L')ss[i]=1;
if (sss[i]=='R')ss[i]=2;
}
while (m--){
scanf("%lld%lld%lld",&x,&y,&z);
add(x,y,z);
}
printf("%lld\n",dijkstra(s,t));
}
return 0;
}
1005.Equal Sentences
1006.Fake Photo
1007.Go Running
思路:匈牙利算法求二分图最大独立点集,+时间戳进行used的清空,O(n*m),也可用dinic网络流,建立超级源点汇点求二分匹配,O(m*sqrt(n))
typedef long long ll;
typedef pair<int,int>P;
const int N=2e5+10;
int n,flag;
struct node{
int x,id;
}a[N],b[N];
vector<int>v[N];
bool cmp(node a,node b){
return a.x<b.x;
}
bool cmp1(node a,node b){
return a.id<b.id;
}
int f[N],used[N],match[N];
bool dfs(int x){
for (int i:v[x]){
if(used[i]!=flag){
used[i]=flag;
if(!match[i]||dfs(match[i])){
match[i]=x;
return 1;
}
}
}
return 0;
}
int main(){
int T;
scanf("%d",&T);
while (T--){
scanf("%d",&n);
int x,y;
for (int i=1;i<=n;i++){
scanf("%d%d",&x,&y);
a[i].x=x-y;b[i].x=x+y;
a[i].id=b[i].id=i;
}
sort(a+1,a+1+n,cmp);sort(b+1,b+1+n,cmp);
int cnt=0;f[a[1].id]=++cnt;
for (int i=2;i<=n;i++){
if (a[i].x==a[i-1].x)f[a[i].id]=f[a[i-1].id];
else f[a[i].id]=++cnt;
}
int p=cnt;
f[b[1].id+n]=++cnt;
for (int i=2;i<=n;i++){
if (b[i].x==b[i-1].x)f[b[i].id+n]=f[b[i-1].id+n];
else f[b[i].id+n]=++cnt;
}
sort(a+1,a+1+n,cmp1);sort(b+1,b+1+n,cmp1);
for (int i=1;i<=n;i++)v[i].clear();
for (int i=1;i<=n;i++){
v[f[i]].push_back(f[i+n]);v[f[i+n]].push_back(f[i]);
}
for (int i=1;i<=cnt;i++)match[i]=used[i]=0;
flag=0;
int ans=0;
for(int i=1;i<=p;i++){
flag++;//时间戳
if(dfs(i))ans++;
}
printf("%d\n",ans);
}
return 0;
}
1008.Head Maker
1009.Imperative Meeting
1010.Joyful Party
1011.Kindergarten Physics
1012.Last Problem
禁止类似码农教程的网站爬取,抄袭博客内容。
https://www.cnblogs.com/rair/

浙公网安备 33010602011771号