奇怪的股市(Hell on the Markets,ACM/ICPC NEERC 2008, UVa1614)
来源:互联网 发布:java暑期培训班 编辑:程序博客网 时间:2024/06/07 03:19
题目描述:简而言之就是给一系列数前面加个正负号,使得其和为0.
解题思路:先给这一系列数排序。如果sum是奇数一定不可行,sum必须是偶数才有解,sum/=2,按照从大到小的顺序使sum-trade[i];直到sum为0。为了记录trade[i]在原序列的位置,用一个map来定位,其键就是trade[i]的值,其值是trade[i]相同时,不同的位置,因为本题中只要trade[i]相同,也就是说只要序列中的数相同,就可以。例如不,用考虑是前面那个3是-1还是后面那个3是-1。这样做是正确的,但没证明出来。
代码如下:
#include <iostream>#include <algorithm>#include <deque>#include <cstdio>#include <cstring>#include <iostream>#include <cstdio>#include <vector>#include <algorithm>#include <cstring>using namespace std;struct node{ int value,loc; node(int a,int b):value(a),loc(b){} node(){}};bool cmp(node a,node b){ return a.value >b.value;}const int maxn=100000+10;int visit[maxn];vector<node> trade;int main(){ int n,x; while(cin >>n) { trade.clear(); memset(visit,0,sizeof(visit)); long long sum=0; for(int i=0;i<n;i++) { scanf("%d",&x); sum+=x; node temp(x,i); trade.push_back(temp); } sort(trade.begin(),trade.end(),cmp); if(sum&1) { cout << "No" << endl; continue; } else { sum/=2; for(int i=0;i<trade.size();i++) { if(sum>=trade[i].value) { sum-=trade[i].value; visit[trade[i].loc]=1; } if(sum==0) break; } cout << "Yes" << endl; for(int i=0;i<n;i++) { if(i!=0) printf(" "); if(visit[i]) cout << "1"; else cout << "-1"; } cout << endl; } } return 0;}关于证明,瑞神有证明,链接http://blog.csdn.net/wcr1996/article/details/43957461另外对序列中数字排序后其位置改变的处理,我宛如一个智障,用个结构体就解决了。代码如下:#include <iostream>#include <cstdio>#include <vector>#include <algorithm>#include <cstring>using namespace std;struct node{ int value,loc; node(int a,int b):value(a),loc(b){} node(){}};bool cmp(node a,node b){ return a.value >b.value;}const int maxn=100000+10;int visit[maxn];vector<node> trade;int main(){ int n,x; while(cin >>n) { trade.clear(); memset(visit,0,sizeof(visit)); long long sum=0; for(int i=0;i<n;i++) { scanf("%d",&x); sum+=x; node temp(x,i); trade.push_back(temp); } sort(trade.begin(),trade.end(),cmp); if(sum&1) { cout << "No" << endl; continue; } else { sum/=2; for(int i=0;i<trade.size();i++) { if(sum>=trade[i].value) { sum-=trade[i].value; visit[trade[i].loc]=1; } if(sum==0) break; } cout << "Yes" << endl; for(int i=0;i<n;i++) { if(i!=0) printf(" "); if(visit[i]) cout << "1"; else cout << "-1"; } cout << endl; } } return 0;}第一份代码时间570ms,第二组代码170ms,还是第二份高效啊。
0 0
- 奇怪的股市(Hell on the Markets,ACM/ICPC NEERC 2008, UVa1614)
- UVA1614 - Hell on the Markets
- 习题8-10 UVA - 1614 Hell on the Markets 奇怪的股市(贪心)
- UVA1614 奇怪的股市
- 1614 - Hell on the Markets(贪心)
- Hell on the Markets UVA
- 习题8-10 奇怪的股市 UVa1614
- UVA 1614Hell on the Markets 结论+贪心 (2008 NE)
- UVa 1614 - Hell on the Markets(贪心)
- UVa 1614:Hell on the Markets(贪心)
- uva 1614 Hell on the Markets(数学相关)
- UVa 1614 Hell on the Markets
- Uva - 1614 - Hell on the Markets
- uva 1614Hell on the Markets
- UVA 1614(p254)----Hell on the Markets
- UVa #1614 Hell on the Markets (习题8-10)
- UVA - 1614 Hell on the Markets 贪心+推理
- uva 1614——UVA 1614 - Hell on the Markets
- Hibernate 映射关系
- vue.js 初体验— Chrome 插件开发实录
- Android Studio创建模拟器中的问题
- 解决Nginx下ThinkPHP框架中的U方法失效问题
- FreeBSD root远程登录
- 奇怪的股市(Hell on the Markets,ACM/ICPC NEERC 2008, UVa1614)
- nginx的安装&配置静态文件访问
- Android开发中拷贝db文件写入SQLite
- Ubuntu Kylin 16.04安装配置FTP服务器
- hibernate中文乱码(&和&)
- Effective OC之对象、消息、运行时
- 安装Scrapy
- DefaultListableBeanFactory
- Android FFmpeg