http://www.luogu.org/contest/show?tid=199

T1: 集合求和

可以找一下规律,对于一个包含n个元素的集合,每个元素在所有子集中出现的次数均为2^(n-1),将sum乘这个数即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
ll x,s,sum;
int main()
{s=1;while (cin>>x) {sum+=x; s<<=1;};printf("%lld",sum*(s>>1));return 0;
}

T2: GCD SUM

我们可以用f[i]表示gcd(x,y)=i的数对共有f[i]个。

从n->1枚举,首先将f[i]赋值为(n/i)*(n/i),然后去掉f[2*i],f[3*i]....即可。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n;
ll ans,f[100005];
int main()
{scanf("%d",&n);for (int d=n;d>=1;d--){f[d]=1ll*(1ll*n/d)*(n/d);for (int i=d+d;i<=n;i+=d) f[d]-=f[i];ans+=f[d]*d;}printf("%lld",ans);
}

T3: 看球泡妹子

本着骗分的想法写了个很暴力的dp,f[i][j][k]即前i个比赛选j个目前帅哥值为k,答案即为max{f[m][k][i],c<=i<=sum},特判一下如果最大的k项相加仍<c则无解(否则只有90分)。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#define ll long long
using namespace std;
int n,m,mx,mn,c,sum,ans;
int a[105],b[105],p[105],q[105],s[105];
int f[105][105][2005];
inline int read()
{int a=0,f=1; char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}return a*f;
}
inline bool cmp(int a,int b)
{return a>b;
}
int main()
{n=read(); m=read(); mx=read(); c=read(); for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<=n;i++) b[i]=read();for (int i=1;i<=m;i++) p[i]=read(),q[i]=read(),s[i]=b[p[i]]+b[q[i]];sort(s+1,s+m+1,cmp);for (int i=1;i<=mx;i++) sum+=s[i];if (sum<c) {printf("-1"); return 0;}for (int i=1;i<=m;i++)for (int j=1;j<=mx;j++)for (int k=mn;k<=2000;k++){f[i][j][k]=f[i-1][j][k];if (k-b[p[i]]-b[q[i]]>=0) f[i][j][k]=max(f[i][j][k],f[i-1][j-1][k-b[p[i]]-b[q[i]]]+a[p[i]]*a[q[i]]);}for (int i=c;i<=2000;i++) ans=max(ans,f[m][mx][i]);if (!ans) printf("-1"); else printf("%d",ans);return 0;
}

T3第二种方法:

令x[i]=20-(b[p[i]]+b[q[i]]),y[i]=a[p[i]]*a[q[i]].那么若满足题意就等价于满足sigma(x[i])<20*k-c;这就成了一个二维费用背包。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
int n,m,K,c,ans;
int a[105],b[105],p[105],q[105],x[105],y[105];
int f[105][2005];
inline int read()
{int a=0,f=1; char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}return a*f;
}
int main()
{n=read(); m=read(); K=read(); c=read(); c=20*K-c;for (int i=1;i<=n;i++) a[i]=read();for (int i=1;i<=n;i++) b[i]=read();for (int i=1;i<=m;i++) {p[i]=read(); q[i]=read(); x[i]=20-b[p[i]]-b[q[i]]; y[i]=a[p[i]]*a[q[i]];}for (int i=1;i<=m;i++)for (int j=K;j>=1;j--)for (int k=c;k>=x[i];k--) f[j][k]=max(f[j][k],f[j-1][k-x[i]]+y[i]);for (int i=1;i<=c;i++) ans=max(ans,f[K][i]);if (!ans) printf("-1"); else printf("%d",ans);return 0;
}

T4: 电路维修

应该是这次比赛比较难的一道题了,我们可以对每条边所在格的四个顶点连边,已相连的权值为0,未相连的权值为1。然后跑最短路就好。

PS:对于判断无解,则为n+m为奇数,画个图即可发现。

PS:我们可以发现有一些点是无论如何都不会走到的,可以忽略这些点,可以省去一半。

PS:spfa80分会TLE,heap+priority_queue可过。

#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<cmath>
#include<queue>
#define ll long long
#define INF 1000000000
#define M 300005
#define pa pair<ll,int>
using namespace std;
int n,m,cnt;
int head[300000],q[300010],dis[300000],next[1200000],list[1200000],key[1200000];
bool v[300000],vis[300000];
priority_queue<pa,vector<pa>,greater<pa> >qq;
inline int read()
{int a=0,f=1; char c=getchar();while (c<'0'||c>'9') {if (c=='-') f=-1; c=getchar();}while (c>='0'&&c<='9') {a=a*10+c-'0'; c=getchar();}return a*f;
}
inline void insert(int x,int y,int z)
{next[++cnt]=head[x];head[x]=cnt;list[cnt]=y;key[cnt]=z;
}
/*inline int spfa()
{for (int i=1;i<=n*m;i++) {dis[i]=INF; v[i]=0;}int t=0,w=1,x; dis[1]=0; v[1]=1; q[1]=1;while (t!=w){t=(t+1)%M;x=q[t];for (int i=head[x];i;i=next[i])if (dis[list[i]]>dis[x]+key[i]){dis[list[i]]=dis[x]+key[i];if (!v[list[i]]){v[list[i]]=1;w=(w+1)%M;q[w]=list[i];}}v[x]=0;}return dis[n*m];
}*/
inline int dijkstra()
{for(int i=1;i<=m*n;i++)dis[i]=INF;dis[1]=0;memset(vis,0,sizeof(vis));qq.push(make_pair(0,1));while(!qq.empty()){int now=qq.top().second;qq.pop();if(vis[now])continue;vis[now]=1;for(int i=head[now];i;i=next[i])if(dis[now]+key[i]<dis[list[i]]){dis[list[i]]=dis[now]+key[i];qq.push(make_pair(dis[list[i]],list[i]));}}return dis[n*m];
}
int main()
{int t=read();while (t--){n=read()+1; m=read()+1;if ((n+m)%2==1) {puts("NO SOLUTION"); continue;}for (int i=1;i<n;i++){char c[505];scanf("%s",c+1);if (i%2==1){for (int j=1;j<m;j+=2){if (c[j]!='/') {insert((i-1)*m+j,i*m+j+1,0); insert(i*m+j+1,(i-1)*m+j,0);}else {insert((i-1)*m+j,i*m+j+1,1); insert(i*m+j+1,(i-1)*m+j,1);}}for (int j=2;j<m;j+=2){if (c[j]!='/') {insert(i*m+j,(i-1)*m+j+1,1); insert((i-1)*m+j+1,i*m+j,1);}else {insert(i*m+j,(i-1)*m+j+1,0); insert((i-1)*m+j+1,i*m+j,0);}}}if (i%2==0){for (int j=1;j<m;j+=2){if (c[j]!='/') {insert(i*m+j,(i-1)*m+j+1,1); insert((i-1)*m+j+1,i*m+j,1);}else {insert(i*m+j,(i-1)*m+j+1,0); insert((i-1)*m+j+1,i*m+j,0);}}for (int j=2;j<m;j+=2){if (c[j]!='/') {insert((i-1)*m+j,i*m+j+1,0); insert(i*m+j+1,(i-1)*m+j,0);}else {insert((i-1)*m+j,i*m+j+1,1); insert(i*m+j+1,(i-1)*m+j,1);}}}}printf("%d\n",dijkstra());for (int i=1;i<=n*m;i++) head[i]=0; cnt=0;}return 0;
}

第一次AK……纪念一下。

转载于:https://www.cnblogs.com/ws-fqk/p/4735123.html

CONTEST199 [有奖]洛谷8月月赛题解相关推荐

  1. Mdoi R2 洛谷4月月赛I

    Mdoi R2 洛谷4月月赛I DIV2 A Car 题目描述 在MDOI市, 为了推行环保, 一辆车是否被限行的依据时车牌号和当天的日期. 车牌号的编码方式是这样的: **·**前三位均为大写字母, ...

  2. 「LuoguP4995」「洛谷11月月赛」 跳跳!(贪心

    题目描述 你是一只小跳蛙,你特别擅长在各种地方跳来跳去. 这一天,你和朋友小 F 一起出去玩耍的时候,遇到了一堆高矮不同的石头,其中第 ii 块的石头高度为 h_ihi​,地面的高度是 h_0 = 0 ...

  3. 洛谷10月月赛 2 t2 深海少女与胖头鱼

    洛谷10月月赛 2 t2 深海少女与胖头鱼 题目链接 参考资料:洛谷10月赛2讲评ppt; 本篇题解考完那天就开始写,断断续续写到今天才写完 本题作为基础的期望dp题,用来学习期望dp还是很不错的 ( ...

  4. 洛谷11月月赛(284pts rank85)

    https://www.luogu.org/contestnew/show/12006 我是比赛完后在去写的 这是我第一次打洛谷月赛,之前一次是比赛完才去看而且写了第一题就没写后面的了 284分,太水 ...

  5. P8318 『JROI-4』淘气的猴子(【LGR-108】洛谷 5 月月赛 I JROI R4 Div.2)

    众所周知,jockbutt 是一个可爱的女孩纸. 题目描述 jockbutt 有一个正整数序列,长度为 n,分别为 a1,a2...an,她非常喜欢这个序列,平时都非常爱惜它们. 可是有一天,当 jo ...

  6. 【洛谷月赛】洛谷11月月赛·Day1

    洛谷2614 计算器弹琴 本题地址: http://www.luogu.org/problem/show?pid=2614 题目描述 总所周知,计算器可以拿来干很多它本不应该干的事情,比如写作文.(参 ...

  7. 洛谷 2 月月赛 I 『MdOI R4』 (Div2) A ~ D 四题全,也许会有六题,超高质量题解 (Div.1E、F下辈子一定补)【每日亿题2 / 9】

    整理的算法模板合集: ACM模板 点我看算法全家桶系列!!! 实际上是一个全新的精炼模板整合计划 目录 A.P7337 『MdOI R4』Fun B.P7338 『MdOI R4』Color C.P7 ...

  8. 洛谷10月月赛II题解

    Solution T1 首先,可以一眼看出这是一个完全图的一笔画问题.然后开始挖性质: ①根据欧拉图的性质,如果将我们一笔画中没有经过的边删去,那么剩下的节点的度数一定有000个或222个是奇数. 通 ...

  9. 【题解】洛谷P4996[【LGR-055】洛谷11月月赛]C.咕咕咕 组合数

    题目链接 #include<cstdio> const int mod=998244353; typedef long long ll; inline int read() {int s= ...

最新文章

  1. 【超简单】MySQL存储引擎的选择与配置
  2. python中strip(),lstrip(),rstrip()函数的讲解
  3. 聊聊JVM(十)Mac下hsdis和jitwatch下载和使用
  4. 好家伙,这才是最强的目标检测落地模型!
  5. RssTookit使用小结
  6. maven远程私服发布jar包
  7. 工作职位推荐系统的算法与架构
  8. seq2seq序列到序列模型
  9. Perl 语言入门学习
  10. 受力分析软件_大赛作品 | 关于Z型路灯受力情况分析
  11. [FPGA基础应用]基于CPLD+ARM架构模拟PC104总线时序
  12. 电商指标之用户留存率
  13. jersey restful 测试_Jersey 开发RESTful(七)Jersey快速入门
  14. js把HTML转成对象,将js对象转换为html
  15. Delphi10.3.3 部署android 开发环境
  16. 计算机硬件是怎么影响性能的,哪些硬件影响电脑的性能
  17. 支持度,置信度,提升度的区别和计算
  18. 电子数字计算机的应用,你了解电子数字计算机的发展吗?人类是如何应用计算机技术的?...
  19. DOS死机客星,能打破程序死循环,按住Ctrl +Esc即可使死掉的程序立即返回到Dos Shell
  20. Android性能优化之使用线程池处理异步任务

热门文章

  1. 游戏寻路中 A* 算法的改进
  2. 五个简单的原则,带你写出整洁代码
  3. SDN第二章 win10远程桌面Ubuntu
  4. Ubuntu18.04挂载exfat格式移动硬盘
  5. 2017-11-26 编程语言试验之Antlr4+Java实现圈2
  6. 在 Linux 上安装 Oracle 数据库 11g
  7. 洛谷 P1849 [USACO12MAR]拖拉机Tractor
  8. 昨天登陆页面,无法进入后台,今天攻克了
  9. “63个国外优秀测试站点链接”和其他相关资料,排除了目前已失效的网站和资料链接。...
  10. 对于长度为5位的一个01串,每一位都可能是0或1,一共有32种可能。