poj2549
来源:互联网 发布:pid补偿网络 编辑:程序博客网 时间:2024/06/05 18:30
枚举+二分。首先用两个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 longconst 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;}
0 0
- poj2549
- poj2549
- poj2549
- poj2549 Sumsets
- POJ2549-Sumsets
- POJ2549-Sumsets
- POJ2549-Sumsets
- poj2549——Sumsets
- poj2549 枚举+二分
- POJ2549 Sumsets 折半枚举
- poj2549 Sumsets(折半枚举)
- poj2549折半枚举
- POJ2549-Sumsets【折半搜索】
- poj2549(折半枚举)
- poj2549 Sumsets双向搜索
- poj2549 3sum/二分查找
- 折半枚举+3SUM--poj2549
- POJ2549【hash分离链接法】
- [10046]oradebug 10046的使用
- ARP协议工作过程
- 大excel文件分割排版为印刷pdf格式:对指定行加粗
- codeforces #329 D. Happy Tree Party (LCA+并查集 || 树链剖分)
- uvalive6952 - Cent Sa dp
- poj2549
- opencv中RNG生成随机数
- 在TabControl中的TabPage选项卡中添加Form窗体
- LeetCode Nim Game 递推
- SQL基础学习6
- leetcode 141.Linked List Cycle
- maven的archetype:create用不起
- ContextLoaderListener作用详解
- Java并发编程:volatile关键字解析