USACO Section 4

前言

好久没更新这个系列了,最近闲的无聊写一下。有两题搜索懒得写了。


P2737 [USACO4.1]麦香牛块Beef McNuggets

https://www.luogu.com.cn/problem/P2737

解题思路

先只考虑a1a_1a1,假设我们拼出了www,那么一定能拼出w+ka1w+ka_1w+ka1,换句话我们考虑最大的不能拼出的ka1+w(0<w<a1)ka_1+w(0<w<a_1)ka1+w(0<w<a1)

考虑到gcd≠1gcd\neq 1gcd=1显然无解所以aaa中肯定存在gcd(ai,a1)=1gcd(a_i,a_1)=1gcd(ai,a1)=1,这样对于每个kai%a1(k<a1)ka_i\% a_1(k<a_1)kai%a1(k<a1)都会有不同的值,所以根据鸽笼原理最大不能拼出的ka1+w≤a1ai−aika_1+w\leq a_1a_i-a_ika1+wa1aiai,这个范围不会很大,暴力背包就好了。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
using namespace std;
const int L=256*256;
int n,a[11],f[L];
int main()
{scanf("%d",&n);int d=0,flag=0;for(int i=1;i<=n;i++){scanf("%d",&a[i]);d=__gcd(d,a[i]);flag|=(a[i]==1);}if(d!=1||flag)return puts("0")&0;f[0]=1;for(int i=1;i<L;i++)for(int j=1;j<=n;j++)if(i>=a[j])f[i]|=f[i-a[j]];for(int i=L-1;i>=1;i--)if(!f[i])return printf("%d\n",i)&0;return 0;
}

P2738 [USACO4.1]篱笆回路Fence Loops

https://www.luogu.com.cn/problem/P2738

解题思路

每个篱笆开两个点,每个篱笆对之间记录他们用来连接的端点然后建图就变成最小环问题了。

枚举篱笆断边然后两端跑最短路就好了。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=210;
struct node{int to,next,w;bool ban;
}a[N*N];
int n,tot,ls[N],f[N],p[N][N],rev[N],pos[N],ans;
bool v[N];queue<int> q;
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;return;
}
void SPFA(int s){memset(f,0x3f,sizeof(f));q.push(s);v[s]=1;f[s]=0;while(!q.empty()){int x=q.front();q.pop();v[x]=0;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(a[i].ban)continue;if(f[x]+a[i].w<f[y]){f[y]=f[x]+a[i].w;if(!v[y])q.push(y);}}}return;
}
int main()
{scanf("%d",&n);for(int i=1;i<=n;i++){int x,l,s1,s2;scanf("%d%d%d%d",&pos[i],&l,&s1,&s2);rev[pos[i]]=i;addl(i*2-1,i*2,l);addl(i*2,i*2-1,l);for(int j=0;j<s1;j++)scanf("%d",&x),p[i][x]=i*2-1;for(int j=0;j<s2;j++)scanf("%d",&x),p[i][x]=i*2;}for(int i=1;i<=n;i++)for(int j=1;j<=n;j++)if(p[i][j])addl(p[i][j],p[rev[j]][pos[i]],0);ans=2147483647;for(int i=1;i<=n;i++){int w=i*2;a[w].ban=a[w-1].ban=1;SPFA(w-1);ans=min(ans,a[w].w+f[w]);a[w].ban=a[w-1].ban=0;}printf("%d\n",ans);return 0;
}

P2740 [USACO4.2]草地排水Drainage Ditches

https://www.luogu.com.cn/problem/P2740

解题思路

最大流模板

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=210;
struct node{int to,next,w;
}a[N<<1];
int n,m,tot=1,ls[N],dep[N],ans;
queue<int> q;
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
bool bfs(){memset(dep,0,sizeof(dep));dep[1]=1;while(!q.empty())q.pop();q.push(1);while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!a[i].w||dep[y])continue;dep[y]=dep[x]+1;if(y==m)return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow){if(x==m)return flow;int rest=0,k;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,min(flow-rest,a[i].w)));a[i].w-=k;a[i^1].w+=k;if(flow==rest)return flow;}if(!rest)dep[x]=0;return rest;
}
int main()
{scanf("%d%d",&n,&m);for(int i=1;i<=n;i++){int x,y,w;scanf("%d%d%d",&x,&y,&w);addl(x,y,w);}while(bfs())ans+=dinic(1,2147483647);printf("%d\n",ans);return 0;
}

P1894 [USACO4.2]完美的牛栏The Perfect Stall

https://www.luogu.com.cn/problem/P1894

解题思路

最大匹配,把上面那个最大流改一下就好了。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
using namespace std;
const int N=410;
struct node{int to,next,w;
}a[N*N];
int n,m,s,t,tot=1,ls[N],dep[N],ans;
queue<int> q;
void addl(int x,int y,int w){a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
bool bfs(){memset(dep,0,sizeof(dep));dep[s]=1;while(!q.empty())q.pop();q.push(s);while(!q.empty()){int x=q.front();q.pop();for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(!a[i].w||dep[y])continue;dep[y]=dep[x]+1;if(y==t)return 1;q.push(y);}}return 0;
}
int dinic(int x,int flow){if(x==t)return flow;int rest=0,k;for(int i=ls[x];i;i=a[i].next){int y=a[i].to;if(dep[x]+1!=dep[y]||!a[i].w)continue;rest+=(k=dinic(y,min(flow-rest,a[i].w)));a[i].w-=k;a[i^1].w+=k;if(flow==rest)return flow;}if(!rest)dep[x]=0;return rest;
}
int main()
{scanf("%d%d",&n,&m);s=n+m+1;t=s+1;for(int i=1;i<=n;i++){int k,x;scanf("%d",&k);for(int j=0;j<k;j++)scanf("%d",&x),addl(i,x+n,1);}for(int i=1;i<=n;i++)addl(s,i,1);for(int i=1;i<=m;i++)addl(i+n,t,1);while(bfs())ans+=dinic(s,2147483647);printf("%d\n",ans);return 0;
}

P2751 [USACO4.2]工序安排Job Processing

https://www.luogu.com.cn/problem/P2751

解题思路

考虑贪心,第一个正着做,开一个单调队列然后每次取最早做完的。

第二个和第一个一样反着做,然后两道工序时间长的配时间短的就好了。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<queue>
#define mp(x,y) make_pair(x,y)
using namespace std;
const int N=1100;
int n,A,B,t[N],s[N],a[N],ans;
priority_queue<pair<int,int> > q;
int main()
{scanf("%d%d%d",&n,&A,&B);for(int i=1;i<=A;i++)scanf("%d",&a[i]),q.push(mp(-a[i],i));for(int i=1;i<=n;i++){pair<int,int> k=q.top();t[i]=-k.first;q.pop();q.push(mp(k.first-a[k.second],k.second));}printf("%d ",t[n]);while(!q.empty())q.pop();for(int i=1;i<=B;i++)scanf("%d",&a[i]),q.push(mp(-a[i],i));for(int i=1;i<=n;i++){pair<int,int> k=q.top();s[i]=-k.first;q.pop();q.push(mp(k.first-a[k.second],k.second));}for(int i=1;i<=n;i++)ans=max(ans,s[i]+t[n-i+1]);printf("%d\n",ans);return 0;
}

P2687 [USACO4.3]逢低吸纳Buy Low, Buy Lower

https://www.luogu.com.cn/problem/P2687

解题思路

最长下降子序列,但是因为是股价序列不同,所以方案数转移的时候枚举到上一个与它相等的就要停止。

要开longdoublelong\ doublelong double或者高精度

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<cctype>
#define ll long double
using namespace std;
const int N=5100;
long long n,a[N];
ll f[N],g[N];
signed main()
{scanf("%lld",&n);for(int i=1;i<=n;i++)scanf("%lld",&a[i]);a[++n]=0;a[0]=1e18;f[0]=g[0]=1;for(int i=1;i<=n;i++){for(int j=0;j<i;j++)if(a[j]>a[i])f[i]=max(f[i],f[j]+1);for(int j=i-1;j>=0;j--)if(a[j]==a[i])break;else if(a[j]>a[i]&&f[j]+1==f[i])g[i]+=g[j];}printf("%.0Lf %.0Lf\n",f[n]-2,g[n]);return 0;
}

P2752 [USACO4.3]街道赛跑Street Race

https://www.luogu.com.cn/problem/P2752

解题思路

先跑一遍FlodyFlodyFlody,然后枚举点,每次重新跑FlodyFlodyFlody判必经点。

然后如果是必经点用第一次的FlodyFlodyFlody判中间点。

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int N=51;
int n;bool a[N][N],f[N][N],g[N][N];
vector<int>ans1,ans2;
int main()
{while(1){int x;scanf("%d",&x);if(x==-1)break;while(x!=-2){a[n][x]=g[n][x]=1;scanf("%d",&x);}n++;}for(int i=0;i<n;i++)a[i][i]=g[i][i]=1;for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)g[i][j]|=g[i][k]&g[k][j];for(int p=1;p<n-1;p++){memset(f,0,sizeof(f));for(int i=0;i<n;i++)for(int j=0;j<n;j++)if(i!=p&&j!=p)f[i][j]=a[i][j];for(int k=0;k<n;k++)for(int i=0;i<n;i++)for(int j=0;j<n;j++)f[i][j]|=f[i][k]&f[k][j];if(!f[0][n-1]){ans1.push_back(p);bool flag=1;for(int i=0;i<n;i++){if(i==p)continue;if(f[0][i])flag&=(g[i][p]&&!g[p][i]);if(f[i][n-1])flag&=g[p][i];}if(flag)ans2.push_back(p);}}printf("%d",ans1.size());for(int i=0;i<ans1.size();i++)printf(" %d",ans1[i]);putchar('\n');printf("%d",ans2.size());for(int i=0;i<ans2.size();i++)printf(" %d",ans2[i]);putchar('\n');return 0;
}

P2753 [USACO4.3]字母游戏Letter Game

解题思路

先看懂题,然后发现虽然字符串很多,但是合法的字符串个数不会超过272^727所以只跑合法的不会超过O(n2)O(n^2)O(n2)

code

#include<cstdio>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
const int w[26]={2,5,4,4,1,6,5,5,1,7,6,3,5,2,3,5,7,2,1,2,4,6,6,7,5,7};
struct node{char s[7];int l,c;
}a[410000];
int n,ans,c[30],v[30];
char t[7];
vector<pair<int,int> >pr;
//bool operator==(node x,node y){
//	for(int i=0;i<7;i++)
//		if(x.s[i]!=y.s[i])return 0;
//	return 1;
//}
//bool operator<(node x,node y){
//	for(int i=0;i<7;i++)
//		if(x.s[i]!=y.s[i])return x.s[i]<y.s[i];
//	return 0;
//}
bool check(node x,node y){for(int i=0;i<26;i++)v[i]=c[i];for(int i=0;i<x.l;i++)if(v[x.s[i]-'a'])v[x.s[i]-'a']--;else return 0;for(int i=0;i<y.l;i++)if(v[y.s[i]-'a'])v[y.s[i]-'a']--;else return 0;return 1;
}
int main()
{scanf("%s",t);int m=strlen(t);for(int i=0;i<m;i++)c[t[i]-'a']++;while(1){++n;scanf("%s",a[n].s);if(a[n].s[0]=='.'){n--;break;}a[n].l=strlen(a[n].s);if(!check(a[n],a[0])){n--;continue;}for(int i=0;i<a[n].l;i++)a[n].c+=w[a[n].s[i]-'a'];}ans=0;for(int i=1;i<=n;i++){if(a[i].c>ans)ans=a[i].c,pr.clear();if(a[i].c==ans)pr.push_back(make_pair(i,0));for(int j=i;j<=n;j++){if(check(a[i],a[j])){if(a[i].c+a[j].c>ans)ans=a[i].c+a[j].c,pr.clear();if(a[i].c+a[j].c==ans)pr.push_back(make_pair(i,j));}}}printf("%d\n",ans);for(int i=0;i<pr.size();i++)printf("%s %s\n",a[pr[i].first].s,a[pr[i].second].s);return 0;
}

P1344 [USACO4.4]追查坏牛奶Pollutant Control

https://www.luogu.com.cn/problem/P1344

解题思路

以前写的了,费用流模板,那个费用变成第一关键值乘上一个很大的值加上第二个关键值就好了。

code

// luogu-judger-enable-o2
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<queue>
#define ll long long
using namespace std;
const ll N=320,M=10010,inf=1e18,cs=2333;
struct node{ll to,next,w;
}a[M*2];
ll tot=1,n,s,t,m,ans;
ll dep[N],ls[N];
queue<int> q;
void addl(ll x,ll y,ll w)
{a[++tot].to=y;a[tot].next=ls[x];ls[x]=tot;a[tot].w=w;a[++tot].to=x;a[tot].next=ls[y];ls[y]=tot;a[tot].w=0;
}
bool bfs()
{memset(dep,0,sizeof(dep));while(!q.empty()) q.pop();q.push(s);dep[s]=1;while(!q.empty()){ll x=q.front();q.pop();for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(!dep[y]&&a[i].w){dep[y]=dep[x]+1;if(y==t) return true;q.push(y);}}}return false;
}
ll dinic(ll x,ll flow)
{ll rest=0,k;if(x==t) return flow;for(ll i=ls[x];i;i=a[i].next){ll y=a[i].to;if(dep[x]+1==dep[y]&&a[i].w){rest+=(k=dinic(y,min(a[i].w,flow-rest)));a[i].w-=k;a[i^1].w+=k;if(rest==flow) return flow;}}if(!rest) dep[x]=0;return rest;
}
void netflow()
{while(bfs())ans+=dinic(s,inf);
}
int main()
{scanf("%lld%lld",&n,&m);s=1;t=n;for(ll i=1;i<=m;i++){ll x,y,w;scanf("%lld%lld%lld",&x,&y,&w);w=w*cs+1;addl(x,y,w);}netflow(); printf("%lld %lld",ans/cs,ans%cs);
}

后面两道搜索懒得写了

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/318372.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

YBTOJ:数列方案(组合数学)

文章目录题目描述解析代码题目描述 解析 如果它不取等&#xff0c;那就和方程的解这道题一样了&#xff0c;但有了等号就很头疼 如何把等号去掉呢&#xff1f; 定义BiAiiB~i~A~i~iB i A i i那么我们就可以得到&#xff1a;0<B1<B2<...<Bm<mn0<B~1~<B~2~&…

【COCI 2018/2019 Round #2】Kocka

这道题也是一个ex的模拟题 不过他比Zamjena可爱 作为一个帅气的小哥哥&#xff0c;让我们一起&#xff0c; 开启你的模拟ex大门&#xff0c;C从入门到放弃&#xff01; 题目 题目描述 我又来了&#xff01;我又来了&#xff01; 在清晨来到儿童游乐园的时候&#xff0c;出题…

Matrix Equation

题意&#xff1a; 题目给出两个矩阵X,Y,现在有两种操作 Z X Y D X⊙Y 问是否存在一个矩阵C&#xff0c;使得ACB⊙C式子成立&#xff0c;问矩阵C能有多少个 题解&#xff1a; 这个式子在模2意义下的加法就等于异或 也就相当于 那现在有 将BC移到左边 然后将Ci,j的系数进…

eShopOnContainers 知多少[6]:持久化事件日志

1. 引言事件总线解决了微服务间如何基于集成事件进行异步通信的问题。然而只有事件总线正常运行&#xff0c;微服务之间基于事件的通信才得以运转。 而现实情况是&#xff0c;总有这样或那样的问题&#xff0c;导致事件总线不稳定或不可用&#xff0c;比如&#xff1a;网络中断…

单调队列优化DP

全局最优解必然包含局部最优解&#xff0c;因此每次转移只需考虑局部最优解&#xff01;&#xff01;&#xff01; 主要内容 形如这样 的 \(\operatorname{DP}\) 转移方程&#xff1a; \[dp[i]\max_{L_i\le j\le R_i}{\{dp[i]val(i,j)\}} \]满足&#xff1a; \(\{L_i\}\) , \(\…

CF1322B-Present【双指针】

正题 题目链接:https://www.luogu.com.cn/problem/CF1322B 题目大意 给出nnn个数字aia_iai​求 ⨁i1n⨁ji1n(aiaj)\bigoplus _{i1}^n\bigoplus _{ji1}^n(a_ia_j)i1⨁n​ji1⨁n​(ai​aj​) 1≤n≤4105,1≤ai≤1071\leq n\leq 4\times 10^5,1\leq a_i\leq 10^71≤n≤4105,1≤a…

多体问题

代码&#xff1a; function SunEarthMoon % M函数文件load planets; % 将planets.mat中的变量mass、position、velocity加载过来[sun, earth, moon] deal(18, 3, 25); % sun、earth、moon分别是18、3、25行 list [sun, earth, moon]; % 1行3列矩阵 G 6.67e-11; % gr…

【CF1179 A,B,C】Valeriy and Deque / Tolik and His Uncle / Serge and Dining Room

还好题很温柔&#xff0c;温柔得我差点没做完 文章目录A&#xff1a;Valeriy and Deque题意题解代码实现B&#xff1a;Tolik and His Uncle题目题解代码实现C&#xff1a;Serge and Dining Room题目题解代码实现A&#xff1a;Valeriy and Deque 题意 给定一个双端队列&#…

YBTOJ:比赛得分(期望)

文章目录题目描述解析代码题目描述 解析 不太难的题 显然本题在AB队员大小关系相反时其对答案的贡献互为相反数。 所以想到把B队队员sort一下后就可以二分找到大小关系相反的分界点 然后维护和与平方和两个前缀数组搞一搞即可O1求出贡献 总复杂度&#xff1a;nlognnlognnlogn …

Matlab与高等数学

曲线与曲面画图 平面 对于不同曲线的表达式&#xff0c;Matlab中有不同的绘图命令&#xff0c;主要有 plot, fplot, ezplot&#xff0c;plot3&#xff0c;polar&#xff0c; 曲面 1.2 曲面画图 曲面的一般方程是F(x,y,z)0&#xff0c;一般需要将曲面的点坐标先表示出来&…

[USACO19JAN,Platinum] Redistricting

[USACO19JAN,Platinum] Redistricting 这道题A了才知道。。并不难a&#xff01; orz 题目 内存限制&#xff1a;128 MiB 时间限制&#xff1a;1000 ms 题目描述 奶牛们的最大城市Bovinopolis正在重新划分势力范围—生活在那里的主要是两个品种的奶牛&#xff08;Holsteins和…

.NET Core + JWT令牌认证 + Vue.js 通用动态权限(RBAC)管理系统框架[DncZeus]开源啦!!!...

DncZeus前言关于 DncZeusDncZeus Dnc Zeus"Dnc"--.Net Core 的缩写&#xff1b;"Zeus"--中文译为宙斯&#xff0c;是古希腊神话中的众神之王&#xff0c;奥林匹斯十二主神之首&#xff0c;统治宇宙万物的至高无上的主神&#xff08;在古希腊神话中主神专…

[gdoi2018 day1]小学生图论题【分治NTT】

正题 题目大意 一张随机的nnn个点的竞赛图&#xff0c;给出它的mmm条相互无交简单路径&#xff0c;求这张竞赛图的期望强联通分量个数。 1≤n,m≤1051\leq n,m\leq 10^51≤n,m≤105 解题思路 先考虑m0m0m0的做法&#xff0c;此时我们考虑一个强联通块的贡献&#xff0c;注意到…

背包问题 DP

各种各样的基础背包 0-1 背包 非常朴素&#xff0c;复杂度 \(O(nV)\) void z_o_pack(int c,int v) {for(int iV;i>c;i--)dp[i]max(dp[i],dp[i-c]v); } 完全背包 复杂度 \(O(nV)\) void comp_pack(int c,int v) {for(int ic;i<V;i)dp[i]max(dp[i],dp[i-c]v); } 多重背包 单…

P5081 Tweetuzki爱取球(期望)(线性求逆元)

文章目录题目描述解析代码题目描述 解析 首先有一个很重要的引理&#xff1a; 若一件事做成的概率是p&#xff0c;则其做成需要次数的期望是1/p 为什么呢&#xff1f; 我们设做成这件事的期望次数是x 就可以列出方程&#xff1a; x1p∗0(1−p)∗xx1p*0(1-p)*xx1p∗0(1−p)∗x …

Matlab与线性代数

文章目录多项式求解1.2 多项式四则运算1.3 多项式的分解与合并行列式求解3、矩阵基本运算➢ 3.2 矩阵的取块和变换➢ 3.3 矩阵的基本运算4、求解线性方程组多项式求解 ➢ 1.1 多项式表达式与根 有关多项式函数表达式与根的Matlab命令&#xff1a; poly2sym 返回由多项式系数转…

【 CF1186D,E,F】Vus the Cossack and Numbers/Vus the Cossack and a Field/Vus the Cossack and a Graph

太ex了&#xff0c;哭了哭了orz 后面两道平均一道花了我一天啊&#xff01; 文章目录D&#xff1a;Vus the Cossack and Numbers题意翻译题解代码实现E&#xff1a;Vus the Cossack and a Field题意翻译题解代码实现F:Vus the Cossack and a Graph题目暴力题解代码实现官方题解…

IdentityServer4与ocelot实现认证与客户端统一入口

关于IdentityServer4与ocelot博客园里已经有很多介绍我这里就不再重复了。ocelot与IdentityServer4组合认证博客园里也有很多&#xff0c;但大多使用ocelot内置的认证&#xff0c;而且大多都是用来认证API的&#xff0c;查找了很多资料也没看到如何认证oidc&#xff0c;所以这里…

CF1556D-Take a Guess【交互】

正题 题目链接:https://codeforces.com/contest/1556/problem/D 题目大意 现在有nnn个你不知道的数字&#xff0c;你有两种询问操作 询问两个下标的数字的andandand询问两个下标的数字的ororor 要求在2n2n2n次操作以内求出第kkk小的数字 1≤n≤104,0≤ai≤1091\leq n\leq 1…

YBTOJ:彩球抽取(期望)

文章目录题目描述解析代码题目描述 解析 首先&#xff0c;可以使用dp解决本题 设fi,j,k&#xff1a;操作i轮之后编号j的小球有k个的概率 转移和统计答案就都不难了 但是还有一个问题 不难发现这个题循环下去是可以无穷无尽的 所以限定一个i的上界&#xff08;如500000&#xf…