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

2015 German Collegiate Programming Contest (GCPC 15)相关推荐

  1. (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

    layout: post title: (寒假开黑gym)2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017) au ...

  2. 2018 German Collegiate Programming Contest (GCPC 18)

    2018 German Collegiate Programming Contest (GCPC 18) Attack on Alpha-Zet 建树,求lca 代码: #include <al ...

  3. 2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18))

    2021 HZNU Winter Training Day 17 (2018 German Collegiate Programming Contest (GCPC 18)) 题目 A B C D E ...

  4. 2017-2018 ACM-ICPC German Collegiate Programming Contest (GCPC 2017)

    A Drawing Borders 很多构造方法,下图可能是最简单的了 代码: #include<bits/stdc++.h> using namespace std; const int ...

  5. 2018 German Collegiate Programming Contest (GCPC 18) M - Mountaineers(启发式合并)

    题目链接:https://codeforces.com/gym/102021/attachments 题意:现在有个地图由n∗mn*mn∗m个方格组成,每个方格上有个数字,代表在这个点的海拔高度,现在 ...

  6. 2015 HIAST Collegiate Programming Contest J

    Polygons Intersection 题意:给2个凸多边形,求相交面积 思路:不会,套板子就是了 AC代码: #include "iostream" #include &qu ...

  7. 2015 AlBaath Collegiate Programming Contest(2月14日训练赛)

    A (By ggg): 题意:一个人还有x秒到红绿灯,这个红绿灯有g秒绿灯,y秒黄 灯,r秒红灯,问你到红绿灯的时候是什么灯.值得注意的是绿 灯变黄灯时,第g秒是黄灯了. B (By Anxdada) ...

  8. Nordic Collegiate Programming Contest 2017 题解

    前几天打了一场外国人的比赛,感觉那边的题目质量还是很好的,区分度很鲜明,题目没有国内的难,坑点比较少,比较注重思维,基础算法. B题: Best Relay Team Picture by Ferna ...

  9. 2015 ACM Arabella Collegiate Programming Contest(F题)

    F. Palindrome [ Color: Pink ] A string is palindrome if it can be read the same way in either direct ...

最新文章

  1. R语言可视化包ggplot2绘制饼图(pie chart)实战
  2. 计算机里面有鬼的恐怖游戏,2018年度十大最佳PC恐怖游戏
  3. oracle创建用户、授予权限及删除用户
  4. 【LeetCode从零单排】No.7 Reverse Integer
  5. 安装ie9提示未能完成安装_IE9浏览器无法安装怎么办?如何解决?
  6. Oracle就业课第六课之游标和触发器
  7. openjdk 编译_使用OpenJDK 11运行JAXB xjc编译器
  8. html一张图片用两种滤镜,HTML图片CSS滤镜—灰度效果
  9. linux CentOS7最小化安装环境静默安装Oracle11GR2数据库(安装常用工具_02)
  10. 计算机专业盲打,在win7系统电脑练习盲打的方法
  11. git rebase基础
  12. ddos攻击数据集_ddos攻击和cc攻击有什么区别?他们2个哪个更厉害?
  13. sql server 表结构信息查询
  14. 简历、PPT以及各尺寸学术会议海报模板(附PPT制作图片、视频、音频等素材及常用网址)
  15. 如果A为假,则蕴含A-B恒为真
  16. java课设超市收银系统_超市收银系统java课程设计.doc
  17. 互联网行业的HR怎么看待30岁以上的基础岗位求职者
  18. 创建不带参数的存储过程
  19. Dynamics 365 配置IFD的向导界面下一步按钮禁用的解决办法
  20. 20120817prbs伪随机二进制序列

热门文章

  1. python安装地是什么_如何安装python
  2. 北航计算机学院有河南的,北航计划在豫招生165人 河南多所高职公布预录名单...
  3. 计算机语言学考研科目,语言学考研笔记整理(共16页)
  4. java static new_java静态类new的对象是否能被回收?
  5. [Swagger2]拓展:其他皮肤
  6. [JavaWeb-CSS]CSS概述
  7. 对象的单数组表示(用单数组实现链表-不一样的链表实现)
  8. android webview framework,android – Webview导致ANR
  9. 蓝桥杯 迷宫与陷阱 BFS
  10. 洛谷P7361:拜神(SA、二分、主席树、启发式合并)