杂题
来源:互联网 发布:邮电大学网络教育 编辑:程序博客网 时间:2024/06/17 13:40
- hdu6090
- hdu3979
- hdu6098
hdu6090
题目大意:对于n个点的无边权无向图,定义dist(i, j)为i到j的最短距离。若i到j不存在路径,则dist(i, j)=n。请构造一张n个点m条边的无边权无向图使得Σ[i from 1 to n]Σ[j from 1 to n]dist(i, j)最小,输出这个最小值
思路:构造一颗菊花树,注意若边数超过完全图的边数,多余的边当作重边处理
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;typedef long long ll;ll ans,n,m;int main(){ int T;scanf("%d",&T); while(T--) { scanf("%lld%lld",&n,&m); if(m>=(n*(n-1))>>1) printf("%lld\n",n*(n-1)); else if(m>n-1) printf("%lld\n",2*n*(n-1)-2*m); else printf("%lld\n",(m+n)*(n-(m+1))*n+2*m+m*(m-1)*2); } return 0;}
hdu3979
题目大意:有n只怪物,每只怪物有生命值hp和攻击力g,你的攻击力为m,生命值无限。每回合你和所有怪物同时攻击。当某个怪物的生命值小于等于0,它就死了。询问击杀怪物所受的最小伤害值。
思路:贪心即可,假设只有两个,然后比较得到不等式(详见代码),然后排序贪心(注意:向上取整的精度)
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e6+10;typedef long long ll;ll m,n;struct Monster{ ll hp,g; bool operator < (const Monster &rhs) const{ return g*((rhs.hp+m-1)/m)>rhs.g*((hp+m-1)/m); }}a[N];int main(){ int T,kase=0;scanf("%d",&T); while(T--) { scanf("%lld%lld",&n,&m); ll sum=0,ans=0; fo(i,1,n) {scanf("%lld%lld",&a[i].hp,&a[i].g);sum+=a[i].g;} sort(a+1,a+1+n); for(int i=1;i<=n;i++) { ans+=((a[i].hp+m-1)/m)*sum; sum-=a[i].g; } cout<<"Case #"<<++kase<<':'<<' '<<ans<<endl; } return 0;}
hdu6098
题目大意:给出一个序列,输出所有含有因子i的max(a[j])值
思路:暴力枚举即可,注意调和级数的时间复杂度是
PS:注意格式,这题评测时不会忽略行末的多余空格和回车
#include<iostream>#include<cstdio>#include<cmath>#include<cstring>#include<algorithm>#define fo(i,a,b) for(int i=a;i<=b;i++)#define fod(i,a,b) for(int i=a;i>=b;i--)using namespace std;const int N=1e5+10;struct Node{ int id,val; bool operator < (const Node &rhs)const{ return rhs.val<val; }}a[N];int t,n;int main(){ scanf("%d",&t); while(t--) { scanf("%d",&n); fo(i,1,n) {scanf("%d",&a[i].val);a[i].id=i;} int b2=0; for(int i=1;i<=n;i+=2) b2=max(b2,a[i].val); printf("%d",b2); sort(a+1,a+1+n); for(int i=3;i<=n;i++) { for(int j=1;j<=n;j++) { if(a[j].id%i!=0) {printf(" %d",a[j].val);break;} } } cout<<endl;// fo(i,1,n) printf("a[%d].id=%d a[%d].val=%d\n",i,a[i].id,i,a[i].val); } return 0;}
阅读全文
0 0
- 杂题
- 杂题
- XP 杂题
- 【杂题】fish
- 杂题-01
- [杂题]AGC015C
- [ 杂题 ] BZOJ5085
- [杂题] pku 2019
- POJ 3299 Humidex 杂题
- POJ杂题(水杂)
- UVa12700 - Banglawash(杂题)
- 【杂题】HDOJ 4768 Flyer
- poj 杂题 - 1959 Darts
- 杂题 - hdu5357 Easy Sequence
- HDU 5233 杂题
- HDU 5480 杂题
- 第一层内容:杂题
- HDU 5500 杂题
- 服务器被挖矿minerd
- C#中将ASCII码以字符的形式显示
- XYNUOJ 1071 译密码
- 将JBoss启动做成Windows的系统服务
- linux 实现shell睡眠脚本
- 杂题
- 【线段树区间更新 && 染色】ZOJ
- c++用WinForm做界面的实现
- springBoot 多数据源事务的管理以及回滚
- Android studio 命令行运行gradle命令
- (HDU
- Listview多条目的代码
- js原生数组工具方法总结
- Python学习笔记——20170823