2015 German Collegiate Programming Contest (GCPC 15)

2015 German Collegiate Programming Contest (GCPC 15)


B. Bounty Hunter II

给定一张DAG,求一种方案:用最少的路径将所有点覆盖。写了按长度贪心,按出度的贪心。。。果断挂了。下来搜了下题解,看到了二分图。就懂了。。。把点拆开,每个出点最多允许连一个入点,反之也是这样。那不就是二分图最大匹配吗?然后把用到的边加进去,算一下联通的链就行了,然后再考虑一下,既然是一条条链,把他们原先看作一条链,然后再断开,断开的地方加1,就是答案,断开的位置一共就有 (点数-边数-1) 个,那就解决了。

#include <bits/stdc++.h>
#define pb push_back
typedef long long ll;
const int N = 1100;
const int M = 1000002;
const int inf = 0x3f3f3f3f;
using namespace std;
int n;
vector<int> G[N];
int mch[N],nxt[N],used[N];
bool dfs(int u) {for(int i=0;i<G[u].size();++i) {int v = G[u][i];if(used[v]) continue;used[v] = 1;if(mch[v]==-1||dfs(mch[v])) {mch[v] = u;nxt[u] = v;return 1;}}return 0;
}
int hungray() {for(int i=0;i<=n;++i) mch[i] = nxt[i] = -1;int ans = 0;for(int i=1;i<=n;++i) {memset(used,0,sizeof(used));if(dfs(i)) ++ans;}return ans;
}
int main() {scanf("%d",&n);for(int i=1;i<=n;++i) {int m,x;scanf("%d",&m);for(int j=1;j<=m;++j)scanf("%d",&x),G[i].pb(x+1);}int ans = hungray();cout << n - ans << endl;return 0;
}

E. Change of Scenery

就是让你判断一下是否有两条长度相同的最短路。一开始的思路是,非严格次短路等于最短路,结果A*炸的很严重,然后看了下数据范围,就写了个暴力的枚举最短路上的边然后求次短路,各种优化还是TLE在test57了。然而这题换个思路不就是最短路计数吗?直接在最短路的时候,维护到这点的最短路的数目就行了。然而注意到这个路径数是非常大的,一开始没有管他,让long long自己溢出,觉得到1的可能性太小了吧。。。结果还真刚好溢出到了1。。。出题人真的是nb。。。于是多取了几个模,就解决了。

#include <bits/stdc++.h>
#define PII pair<int,int>
#define MP make_pair
typedef long long ll;
const int N = 20000;
const int M = 2000600;
const ll inf = 10000000000LL;
const ll P = 1e9 + 7;
const ll P1 = 1e8 + 7;
using namespace std;
struct edge{int e,nxt;ll w;}E[M];
int cc,h[N];
void add(int u,int v,ll z) {E[cc].e=v;E[cc].w=z;E[cc].nxt=h[u];h[u]=cc;++cc;
}
int n,m,k,p[N],A[M],cnt;struct node{int x;ll d;node(){}node(int a,ll b){x=a;d=b;}bool operator < (const node a)const {return a.d < d;}
};ll dis[N],num[N],num1[N];
int vis[N];
void dij() {for(int i=1;i<=n;++i)dis[i]=inf;priority_queue<node> q;q.push(node(1,0));dis[1]=0;num[1]=1;num1[1]=1;while(!q.empty()) {node tmp = q.top(); q.pop();int u=tmp.x;if(vis[u])continue;vis[u]=1;for(int i=h[u];~i;i=E[i].nxt) {int v=E[i].e;if(dis[v]>dis[u]+E[i].w) {dis[v]=dis[u]+E[i].w;num[v]=num[u];num1[v]=num1[u];q.push(node(v,dis[v]));}else if(dis[v]==dis[u]+E[i].w) {num[v]=(num[v]+num[u])%P;num1[v]=(num1[v]+num1[u])%P1;}}}return;
}int main() {scanf("%d%d%d",&n,&m,&k);for(int i=1;i<=n;++i) h[i]=-1;int x;for(int i=1;i<=k;++i) scanf("%d",&p[i]);for(int i=1;i<=m;++i) {int x,y;ll z;scanf("%d%d%I64d",&x,&y,&z);if(x>y) swap(x,y);add(x,y,z),add(y,x,z);}dij();if(num[n]!=1)puts("yes");else if(num1[n]!=1)puts("yes");else puts("no");return 0;
}

F. Divisions

直接大数分解,然后约数个数定理

#include <bits/stdc++.h>
typedef long long ll;
#define inf 1000000000
using namespace std;
ll read() {ll x=0,f=1;char ch=getchar();while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}return x*f;
}
ll gcd(ll a,ll b) {return b==0?a:gcd(b,a%b);}
int n;
ll x,mx;
vector<ll> q;
ll mul(ll a,ll b,ll p) {ll tmp=(a*b-(ll)((long double)a/p*b+1e-8)*p);return tmp<0?tmp+p:tmp;
}
ll pow(ll a,ll b,ll p) {ll ans=1;a%=p;for(ll i=b;i;i>>=1,a=mul(a,a,p))if(i&1)ans=mul(ans,a,p);return ans;
}
bool check(ll a,ll n,ll r,ll s) {ll ans=pow(a,r,n),p=ans;for(int i=1;i<=s;i++) {ans=mul(ans,ans,n);if(ans==1&&p!=1&&p!=n-1)return 1;p=ans;}if(ans!=1)return 1;return 0;
}
bool MR(ll n) {if(n<=1)return 0;if(n==2)return 1;if(n%2==0)return 0;ll r=n-1,s=0;while(r%2==0)r/=2,s++;for(int i=0;i<10;i++)if(check(rand()%(n-1)+1,n,r,s))return 0;return 1;
}
ll rho(ll n,ll c) {ll k=2,x=rand()%n,y=x,p=1;for(ll i=1;p==1;i++) {x=(mul(x,x,n)+c)%n;p=y>x?y-x:x-y;p=gcd(n,p);if(i==k)y=x,k+=k;}return p;
}
void solve(ll n) {if(n==1)return;if(MR(n)){mx=max(n,mx);return;}ll t=n;while(t==n)t=rho(n,rand()%(n-1)+1);solve(t);solve(n/t);
}
int main() {ll x,tmp=0,ans=1;scanf("%I64d",&x);while(x!=1){mx = 0;tmp=0;solve(x);while(x%mx==0)x/=mx,++tmp;ans=ans*(tmp+1);}cout << ans << endl;return 0;
}

G. Extreme Sort

扫一遍

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;
int n,a[1055];
int main() {scanf("%d",&n);for(int i=1;i<=n;++i) {scanf("%d",&a[i]);}int f=0;for(int i=2;i<=n;++i) if(a[i-1]>a[i]){puts("no");f=1;break;}if(!f)puts("yes");return 0;
}

H. Legacy Code

读题恶心死了的水题

#include <bits/stdc++.h>
#define pb push_back
typedef long long ll;
const int N = 555;
const int M = 2000100;
using namespace std;
vector<int> G[N];
void add(int u,int v) {G[u].pb(v);
}
int n,m;
string s[N],ts,fid[M];
vector<string> v[N];int ck(string s) {string t = "::PROGRAM";int c=t.size()-1;for(int i=c,j=s.size()-1;i>=0&&j>=0;--i,--j) {if(t[i]!=s[j]) return 0;}return 1;
}
map<string,int> id;
queue<int> q;
int cnt,vis[N];
void ins(string s) {if(id.find(s)==id.end()) {id[s] = ++cnt;fid[cnt] = s;if(ck(s)) vis[cnt]=1,q.push(cnt);}
}
void build() {for(int i=1;i<=n;++i)for(int j=0;j<v[i].size();++j){//add(id[s[i]],id[v[i][j]]);add(id[v[i][j]],id[s[i]]);}
}
int solve() {int ans = 0;while(!q.empty()) {int u = q.front(); q.pop();for(int i=0;i<G[u].size();++i) {int v=G[u][i];if(!vis[v]) {vis[v]=1;q.push(v);}}}for(int i=1;i<=cnt;++i)if(!vis[i]&&!ck(fid[i])) ++ans;return ans;
}
int main() {scanf("%d", &n);for(int i=1;i<=n;++i) {cin >> s[i] >> m;ins(s[i]);for(int j=1;j<=m;++j) {cin >> ts;v[i].pb(ts);ins(ts);}}build();printf("%d\n", solve());return 0;
}

I. Milling machines

水题

#include <bits/stdc++.h>
typedef long long ll;
const int N = 555;
using namespace std;
int w,s,X,Y,mx[N],mp[20000][N];
int cal(int h,int s) {return min(h,Y-s);
}
int main() {scanf("%d%d%d%d",&w,&s,&X,&Y);for(int i=1;i<=w;++i)for(int j=1;j<=X;++j)scanf("%d",&mp[i][j]);for(int i=1;i<=s;++i) {for(int j=1;j<=X;++j) {int x;scanf("%d",&x);mx[j] = max(mx[j],x);}}for(int i=1;i<=w;++i) {int f=0;for(int j=1;j<=X;++j) {if(f)printf(" ");f=1;printf("%d",cal(mp[i][j],mx[j]));}puts("");}return 0;
}

K. Upside down primes

按题意模拟。关键在于判素数,脑残的用了大数素性测试,被卡的。。。然后写了java的用自带的测试,结果更凉。只用测两个数啊,暴力就ok了啊。。。

#include <bits/stdc++.h>
typedef long long ll;
using namespace std;bool isp(ll n) {for(ll i=2;i*i<=n;i++) {if(n%i==0) return false;}return n!=1;
}
bool isp2(ll x) {if(x==1)return 0;if(x%2==0)return 0;for(ll i=2;i<x;++i)if(x%i==0)return 0;return 1;
}
int n,M[555];
char s[50];
int ckf() {for(int i=0;i<n;++i)if(M[s[i]]==-1)return 0;return 1;
}
ll fan() {ll ans=0;reverse(s,s+n);for(int i=0;i<n;++i){ll x=M[s[i]];ans = ans*10LL+x;}return ans;
}
int main() {M['0']=0;M['1']=1;M['2']=2;M['3']=-1;M['4']=-1;M['5']=5;M['6']=9;M['7']=-1;M['8']=8;M['9']=6;scanf(" %s",s);n=strlen(s);ll x=0;for(int i=0;i<n;++i)x=x*10LL+s[i]-'0';if(!isp(x)) {printf("no\n");}else if(!ckf()) {printf("no\n");}else {x = fan();if(!isp(x)) printf("no\n");else printf("yes\n");}return 0;
}

总结:被水题场+模板题场干翻我是服气的,下次读完题再开始写。。。英语阅读能力太差了,根本不想看这题。。。

转载于:https://www.cnblogs.com/RRRR-wys/p/9312673.html

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

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

相关文章

ASP.NET Core URL Rewrite中间件

URL重写是基于一个或多个预置规则修改请求URL的行为。URL重写在资源位置和访问地址之间创建了一种抽象&#xff0c;这样二者之间就减少了紧密的联系。URL重写有多种适用的场景&#xff1a;临时或永久移动或替换服务器资源&#xff0c;同时为这些资源保持稳定的访问为不同应用程…

打击犯罪【并查集】

打击犯罪 题目大意&#xff1a; 有n个人&#xff0c;相互之间有一些关系&#xff0c;从而形成一个图&#xff0c;现在要从1……n1……n1……n按顺序去掉k个人&#xff08;即去掉1……k1……k1……k&#xff09;&#xff0c;使最大的子图的点数 <n/2<n/2<n/2&#xf…

StackExchange.Redis性能调优

编者&#xff1a;.net core redis 驱动推荐&#xff0c;为什么不使用 StackExchange.Redis 引起了很大的反响&#xff0c;大家反应过度&#xff0c;其实StackExchange.Redis 2.0已经从重构了异步队列&#xff0c;使用管道方式解决异步慢的问题。这篇文章也可以帮助大家正确认识…

糊涂的教授【拓扑排序】

糊涂的教授 题目大意&#xff1a; 有n个矩阵&#xff08;有些部分重叠在一起&#xff09;&#xff0c;现在有一些位置写着一些数字&#xff0c;表示它原来的序号&#xff0c;问每一个矩阵原来的序号 原题&#xff1a; 题目描述 陈教授是一个国际知名的教授&#xff0c;很多…

P6860-象棋与马【欧拉函数,杜教筛】

出题人来报个到 正题 题目链接:https://www.luogu.com.cn/problem/P6860 题目大意 p(a,b)1p(a,b)1p(a,b)1当且经当一只走a∗ba*ba∗b矩形的马可以走到棋盘上任何一个点 求∑a1n∑b1np(a,b)\sum_{a1}^n\sum_{b1}^np(a,b)a1∑n​b1∑n​p(a,b) 解题思路 这个马能走到全图的充要…

Codeforces Round #498 (Div. 3)

D. Two Strings Swaps 容易发现&#xff0c;a[i], a[n-i1], b[i], b[n-i1] 可以互相交换&#xff0c;且不会受其他地方影响&#xff0c;关键在于对于这4个字符怎们计算最小的操作数&#xff0c;讨论到死。。。看了别人的代码&#xff0c;用不同的字符对数表示字符的组成&#x…

用HttpClientFactory来实现简单的熔断降级

前言在2.1之后&#xff0c;有不少新东西&#xff0c;其中HttpClientFactory算是一个。HttpClientFactory涉及的东西也不算少&#xff0c;三四种clients , 请求中间件&#xff0c;与Polly的结合&#xff0c;生命周期等。Steeltoe的组件升级到2.1后&#xff0c;不少示例代码已经使…

【前缀和】【DP】登机(jzoj 5535)

登机 jzoj 5535 题目大意&#xff1a; 有一架飞机&#xff0c;有n个人要登机&#xff0c;每个人的不满值为登机时当前机舱在他所在行前方的人数总和&#xff0c;现在可以把飞机分为k个机舱&#xff0c;使不满值总和最小 原题&#xff1a; 题目描述 小H是机场登机的执行经…

后缀数组学习笔记

后缀数组学习笔记 说在前边 学习了《后缀数组——处理字符串的有力工具》终于感觉入门了&#xff0c;就总结一下&#xff0c;主要是应用原理讲解学习了 大佬Blog一些性质 height数组&#xff1a;定义height[i]suffix(sa[i-1])和suffix(sa[i])的最长公共前缀&#xff0c;也就是排…

CF140C-New Year Snowmen【优先队列】

正题 题目链接:https://www.luogu.com.cn/problem/CF140C 题目大意 nnn个雪球&#xff0c;一个雪人需要用333个不同大小的雪球堆起&#xff0c;求最多雪人。 解题思路 我们每次拿相同雪球中最多的三个来堆即可&#xff0c;用优先队列维护。 时间复杂度O(nlog⁡n)O(n\log n)O…

基于.net standard 的动态编译实现

在前文[基于.net core 微服务的另类实现]结尾处&#xff0c;提到了如何方便自动的生成微服务的客户端代理&#xff0c;使对于调用方透明&#xff0c;同时将枯燥的东西使用框架集成&#xff0c;以提高使用便捷性。在尝试了基于 Emit 中间语言后&#xff0c;最终决定使用生成代码…

线段树动态开点区间加区间求和

线段树动态开点区间加区间求和 题目来源&#xff1a; 陕西师范大学第七届程序设计竞赛网络同步赛 H. 万恶的柯怡 思想&#xff1a; 保证叶子节点被完整的覆盖&#xff0c;需要开节点&#xff0c;就把左右儿子都开出来&#xff0c;其余和普通线段树一样。 tips&#xff1a; 用结…

初一模拟赛总结(6.6 my brother高考前一天,加油!(。・`ω´・。))

成绩&#xff1a; 注&#xff1a;rankrankrank是有算其他$dalao的 T1T1T1好像因为精度问题被卡了 rankrankranknamenamenamescorescorescoreT1T1T1T2T2T2T3T3T3T4T4T4111hkyhkyhky180180180100100100000808080000222whdwhdwhd130130130100100100000202020101010222lyflyflyf13…

P1337-[JSOI2004]平衡点/吊打XXX【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P1337 题目大意 nnn个点有重量wiw_iwi​&#xff0c;求重心。 解题思路 模拟退火随机找一个重心然后不断接近即可。 codecodecode #include<cstdio> #include<cstring> #include<algorithm> #include<…

基于阿里云 DNS API 实现的 DDNS 工具

0.简要介绍0.1 思路说明AliDDNSNet 是基于 .NET Core 开发的动态 DNS 解析工具&#xff0c;借助于阿里云的 DNS API 来实现域名与动态 IP 的绑定功能。工具核心就是调用了阿里云 DNS 的两个 API &#xff0c;一个 API 获取指定域名的所有解析记录&#xff0c;然后通过比对与当前…

【拓扑排序】【DP】奖金(ssl 1325)

奖金 ssl 1325 题目大意&#xff1a; 有n个人&#xff0c;某个人要比另外一个人的工资高&#xff08;工资最低为100&#xff0c;最少多1元&#xff09;&#xff0c;问最少发多少工资 原题&#xff1a; 题目描述 由于无敌的凡凡在2005年世界英俊帅气男总决选中胜出&#x…

网络流24题

网络流24题 说在前边 一直没有完整的刷过这套题&#xff0c;打算最近一点点刷掉通过《最小割模型在信息学竞赛中的应用》及《浅析一类最小割问题》学习常规建图技巧飞行员配对方案问题 二分图最大匹配 #include <bits/stdc.h> typedef long long ll; const int inf 0x3f…

P3959-宝藏【模拟退火】

正题 题目链接:https://www.luogu.com.cn/problem/P3959 题目大意 nnn个点&#xff0c;mmm条边&#xff0c;求一棵有根生成树权值最小。对于一条边(fa,x,w)(fa,x,w)(fa,x,w)会产生权值depfa∗wdep_{fa}*wdepfa​∗w。 解题思路 我们模拟退火每次随机一个序列&#xff0c;然后…

ASP.NET Core Web API 集成测试中使用 Bearer Token

在 ASP.NET Core Web API 集成测试一文中, 我介绍了ASP.NET Core Web API的集成测试. 在那里我使用了测试专用的Startup类, 里面的配置和开发时有一些区别, 例如里面去掉了用户身份验证相关的中间件.但是有些被测试的行为里面需要用到身份/授权信息.所以本文就介绍一下在API集成…

桐桐的雷达

桐桐的雷达 题目大意&#xff1a; 有一堆数字&#xff0c;并给出一个范围&#xff0c;判断不在范围内的数字是否多过10%&#xff0c;若不多过&#xff0c;那输出范围内数字的平均值 原题&#xff1a; 题目描述 桐桐在去广州的路上&#xff0c;对高速公路上的测速雷达产生了…