poj2549
2015-11-08 10:58
169 查看
枚举+二分。首先用两个for循环确定所有a+b的值,然后再用两个for循环确定所有d-c的值,然后枚举a+b的值,二分所有d-c的值,看是否有相等并且符合条件的值,更新保存最大的d值,最后输出。
#include<stdio.h> #include<iostream> #include<string> #include<string.h> #include<algorithm> #include<iomanip> #include<vector> #include<time.h> #include<queue> #include<stack> #include<iterator> #include<math.h> #include<stdlib.h> #include<limits.h> #include<map> #include<set> #include<bitset> //#define ONLINE_JUDGE #define eps 1e-6 #define INF 0x7fffffff #define FOR(i,a) for((i)=0;i<(a);(i)++) #define MEM(a) (memset((a),0,sizeof(a))) #define sfs(a) scanf("%s",a) #define sf(a) scanf("%d",&a) #define sfI(a) scanf("%I64d",&a) #define pf(a) printf("%d\n",a) #define pfI(a) printf("%I64d\n",a) #define pfs(a) printf("%s\n",a) #define sfd(a,b) scanf("%d%d",&a,&b) #define sft(a,b,num) scanf("%d%d%d",&a,&b,&num) #define for1(i,a,b) for(int i=(a);i<b;i++) #define for2(i,a,b) for(int i=(a);i<=b;i++) #define for3(i,a,b)for(int i=(b);i>=a;i--) #define MEM1(a) memset(a,0,sizeof(a)) #define MEM2(a) memset(a,-1,sizeof(a)) #define ll long long const double PI=acos(-1.0); template<class T> T gcd(T a,T b){return b?gcd(b,a%b):a;} template<class T> T lcm(T a,T b){return a/gcd(a,b)*b;} template<class T> inline T Min(T a,T b){return a<b?a:b;} template<class T> inline T Max(T a,T b){return a>b?a:b;} using namespace std; //#pragma comment(linker,"/STACK:1024000000,1024000000") int n,m; #define N 210 #define M 1000010 #define Mod 1000000000 #define p(x,y) make_pair(x,y) #define pr pair<ll,int> struct Node{ int sum; int id1,id2; bool operator < (const Node &x) const{ return sum<x.sum; } }; vector<Node> v1; vector<Node> v2; int a[1010]; bool check(int id1,int id2,int id3,int id4){ if(id1 == id2 || id1 == id3 || id1 == id4) return false; if(id2 == id1 || id2 == id3 || id2 == id4) return false; if(id3 == id1 || id3 == id2 || id3 == id4) return false; if(id4 == id1 || id4 == id2 || id4 == id3) return false; return true; } int main(){ #ifndef ONLINE_JUDGE freopen("in.txt", "r", stdin); // freopen("out.txt", "w", stdout); #endif while(sf(n)!=EOF&&n){ for(int i=0;i<n;i++) sf(a[i]); Node tmp; v1.clear(); v2.clear(); for(int i=0;i<n;i++){ //循环确定所有a+b的值 for(int j=i+1;j<n;j++){ tmp.sum = a[i]+a[j]; tmp.id1 = i; tmp.id2 = j; v1.push_back(tmp); } } for(int i=0;i<n;i++){ //循环确定所有d-c值 for(int j=0;j<n;j++){ if(i == j) continue; tmp.sum = a[i]-a[j]; tmp.id1 = i; tmp.id2 = j; v2.push_back(tmp); } } sort(v1.begin(),v1.end()); sort(v2.begin(),v2.end()); //排序 int size = (int)v1.size(); int size2 = (int)v2.size(); int ans=-INF; for(int i=0;i<size;i++){ int tmp = v1[i].sum; int id1 = v1[i].id1; int id2 = v1[i].id2; int id = lower_bound(v2.begin(),v2.end(),v1[i])-v2.begin();//二分寻找第一个>=a+b的值 while(id<size2 && v2[id].sum == tmp){ //从第一个>=a+b的值到第一个>a+b的值位置,其中所有都符合a+b+c=d int id3 = v2[id].id1; int id4 = v2[id].id2; if(check(id1,id2,id3,id4)){ //a,b,c,d四个数的id都不相同 ans = Max(ans,a[id3]); } id++; } } if(ans != -INF) printf("%d\n",ans); else printf("no solution\n"); } return 0; }
相关文章推荐
- Openstack Murano(kilo)二次开发之添加Volume
- BFC, IFC
- ARP协议工作过程
- mysql show命令集合
- 信息安全系统设计基础第八周学习总结
- less和scss
- Java动态代理机制
- Linux 学习(3)-- kernel版本号的修改
- Python学习笔记(3)range的用法
- ApplicationContext的三种实现方式以及在web.xml配置的两种方式
- 哪种性格的人更长寿
- [转]python os模块 常用命令
- 树链剖分模版
- 浅析Linux计算机进程地址空间与内核装载ELF
- Windows下用ndk编译ffmpeg
- volatile的详细讲解
- 经典SQL语句大全
- 十进制大数的加法运算
- java 多线程之卖票两种方式
- double转BigDecimal,数变大