------代码摘自于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;
}