------代码摘自于jls hdu多校赛讲解视频

A.muximum multiple
///找到3个正整数,满足x+y+z=n,x|n,y|n,z|n
//最大化xyz
/*
3|n n/3 n/3 n/3
n/2 n/4 n/4
n/2 n/3 n/6
r=n/x s=n/y t=n/z
1/r+1/s+1/t=1
r<=s<=t
r<=3
r=2 1/s+1/t+1/2 s,t=(4,4),(3,6)
r=3 s,t=(3,3)

6|n
因为这个不定方程只有3组解
*/

#include<bits/stdc++.h> 
using namespace std;
#define rep(i,a,n) for (int i=a;i<n;i++)
#define per(i,a,n)  for (int i=n-1;i>=0;i--)
#define pb push_back
#define mp make_pair
#define all(x) (x).begin(),x.end()
#define fi first
#define se second
#define SZ(x) ((int)x.size())
typedef vector<int> v;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=1000000007;

//ll powmod(ll a,ll b)  {ll res=1;a%=mod;assert(b>=0)}
//}
int n,_;
int main()
{
	  for (scanf("%d",&_);_;_--)
	    {
	     scanf("%d",&n);
		  if (n%3==0)	
		   printf("%lld\n",1ll*n*n*n/27);
		  else if (n%4==0)
		   printf("%lld\n",1ll*n*n*n/32);
		  else puts("-1");
		}
    return 0;
}

B.triangle …

#include<cstdio>
#include<cstring>
#include<string>
using namespace std;
#define fi first
#define se second
typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll mod=100000007; 
#defien mp make_pair
//ll powmod(ll a,ll b){ll res=1;a%=mod;assert(b>=0)}
ll gcd(ll a,ll b) {return b?a:gcd(b,a%b);} 
const int N=101000;
int _,x,y;
pair<PII,int>p[N];
int main(){
	for (scanf("%d",&_);_;_--)
	  {
	  	scanf("%d",&n);
	  	for (i,0,3*n)
	  	{
	  		scanf("%d%d",&x,&y);
	  		p[i]=mp(mp(x,y),i);
		  }
		  sort(p,p+3*n);
		  rep(i,0,n)
		  {
		  	
		  }
	  }
	return 0;
}

````·
#include<cstdio>
#include<iostream>
#include<algorithm>
using namespace std;

const int maxn=3e3+7; 
struct node{
	int x,y,num;
	node(int x,int y,int num):x(x),y(y),num(num){}
	node(){}
	bool operator<(const node &o)const{
	 return x<o.x||x==o.x&&y<o.y;
	}
}a[maxn];

int main()
{
	int _;
	scanf("%d",&_);
	for (;_;_--)
	{
		int n;
		scanf("%d",&n);
		for (int i=0;i<3*n;i++)
		{
			int x,y;
			scanf("%d%d",&x,&y);
			a[i]=node(x,y,i+1);
		}
		sort(a,a+3*n);
		int j=0;
		for (int i=0;i<n;i++)
		  {
		  	printf("%d %d %d\n",a[j].num,a[j+1].num,a[j+2].num);
		  	j+=3;
		  }
	}
	return 0;
}
····

 

C.Time Zone

#include<cstdio>
using namespace std;
int _,h,m,c,sign;
char s[20];
double d;
int main(){
	for (scanf("%d",&_);_;_--)
	{
		scanf("%d%d%s",&h,&m,s);
	    h=h*60+m; 
	    int sign=s[3]=='+'?1:-1;
		sscanf(s+4,"%lf",&d); 
	    c=(int)(d*10);//+0.1);
	    c=sign*c*6-8*60;
	    //(sign*c-8)*60 
		h+=c;
		h%=(24*60);
		if (h<0) h+=24*60;
		printf("%02d:%02d\n",h/60,h%60); 
	} 
   return 0;
}

D.Distinct Values

//有一堆线段,线段里的所有数字都不能相同,先处理出每个数字跟前面那些位置不一样
//,或者对每个位置找出覆盖它区间最前面到哪里。
 
#include<iostream>
#include<set>
using namespace std;
#define rep(i,a,n)  for (int i=a;i<n;i++)
#define per(i,a,n)  for (int i=n-1;i>=a;i--)
#define pb push_back  
#define mp make_pair
#define all(x) (x).begin(),(x).end
#define fi first
#define se second
#define SZ(x) ((int) x.size())
//typedef vector<int> VI;
typedef long long ll;
typedef pair<int,int> PII;
const ll  mod=1000000007;
ll gcd(ll a,ll b)
{return b?gcd(b,a%b):a;} 
const int N=101000;
int _n,m,pre[N],l,r,ret[N]; 
int main()
{
  int _;
  scanf("%d",&_);
  for (;_;_--)	
     {  
        int n,m;
     	scanf("%d%d",&n,&m);
     	rep(i,1,n+1) pre[i]=i;//每个区间只能覆盖到它自己
		rep(i,0,m){
			scanf("%d%d",&l,&r);
			pre[r]=min(pre[r],l);//每个右端点所能覆盖到区间最左边在哪 
		}
		per(i,1,n) //for (int i=n-1;i>=1;i--)
		  pre[i] =min(pre[i],pre[i+1]);//倒着更新一下 
		int pl=1;
		set<int> val;//可行的数字的集合 
		rep(i,1,n+1) val.insert(i);//当前可以选的数字,1到n都可以选 
		rep(i,1,n+1){
		//[pl,i-1]
		   //pl->pre[i]-1
		//[pre[i],i]
		while (pl<pre[i])
		{
			val.insert(ret[pl]);
			pl++;
		}
		
		ret[i]=*val.begin();
		val.erase(ret[i]); 
	    }
	 
	 rep(i,1,n+1) printf("%d%c",ret[i]," \n"[i==n]);
}
}

E.Sequence balance

栈 
)  (  ( 
a ) b(
() ()
(a,b) a个)  b个(
))))))))((
))((((((
))))))((((
))))))))((((
)))((((((
))))))))(((((
))))))((((((
贪心
先把先把前短后长的放前面,前长后短的放后面
a-b拍个序,也可以按a排序,b排序
*/ 
#include<cstring>
#include<string>
#include<cstdio>
#include<cmath>
#include<algorithm>
using namespace std;
const int MAXN=101010;
const int MAXS=101010;
int n;
class Str{
 public:
    int l,r,add;
    bool operator<(const Str &b) const{//这个cmp函数是先看一下前面短后面长还是后面短前面长 
     if (l>=r&&b.l<b.r) //cmp函数是先看一下前面长后面短还是  前面长后面短的放后面 
         return false;
     if (l<r&&b.l>=b.r)//前面短后面长的放前面 
         return true;
     if (l>=r&&b.l>=b.r)//都是前面长后面短的话我们只需要比较后面的部分 
         return r>b.r;
     return l<b.l;//都是后面长前面短的话我们只需要比较前面的部分 
    }	
}a[MAXN];
char s[MAXS];
void solve()
{
   scanf("%d",&n);
  for (int i=1;i<=n;i++)
   {
      	 scanf("%s",s);
        int len=strlen(s);
   	 a[i].l=a[i].r=a[i].add=0;
   	 for (int j=0;j<len;j++)
   	    {
   	       if (s[j]=='(')
   		     a[i].r++;
   			else {
   				if (a[i].r>0)
   				  a[i].r--,a[i].add++;
   			     else 
   			       a[i].l++;
   			}	
   		} 
      }	
      sort(a+1,a+n+1);
      int ans=0;
      int now=0;
      for (int i=1;i<=n;i++)
       {
         if (a[i].l>now)
   	    a[i].l=now;
   	  ans+=a[i].l+a[i].add;
   	  now-=a[i].l;
   	  now+=a[i].r;	
   	}
     printf("%d\n",ans*2); 	
    
}


int main()
{ int _;
  scanf("%d",&_);
  for (;_;_--)
 solve(); 	
 return 0;	
}