A. Up the hill
构造
#include <iostream>
using namespace std;
int a,b;
int main()
{
cin >> a >> b;
for (int i = b+1; i > 0; i--) cout << i << ' ';
for (int i = 1; i <= a; i++) cout << i+b+1 << ' ';
return 0;
}
B. New York Hotel
模拟或者数学题
计算出离四个角最近的四个点,然后暴力枚举
// whn6325689
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef complex<ld> point;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef vector<int> vi;
#define CLR(x,y) memset(x,y,sizeof(x))
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define lowbit(x) (x&(-x))
#define MID(x,y) (x+((y-x)>>1))
#define eps 1e-9
#define INF 0x3f3f3f3f
#define LLINF 1LL<<62
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1; char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
template <class T>
inline void write(T n)
{
if(n < 0)
{
putchar('-');
n = -n;
}
int len = 0,data[20];
while(n)
{
data[len++] = n%10;
n /= 10;
}
if(!len) data[len++] = 0;
while(len--) putchar(data[len]+48);
}
//-----------------------------------
const int MAXN=1e5+9;
ll dis(ll x1,ll y1,ll x2,ll y2)
{
return abs(x1-x2)+abs(y1-y2);
}
int n,m,cc,hh;
ll a,b;
ll ans=LLINF,id=-1;
ll x[4],y[4];
ll milu=LLINF,mild=LLINF,miru=LLINF,mird=LLINF,maxx;
int main()
{
read(n),read(m);
read(cc);
for(int i=0;i<cc;i++)
{
read(a),read(b);
if(dis(0,0,a,b) <= milu)
{
milu=dis(0,0,a,b);
x[0]=a,y[0]=b;
}
if(dis(n,0,a,b) <= mild)
{
mild=dis(n,0,a,b);
x[1]=a,y[1]=b;
}
if(dis(0,m,a,b) <= miru)
{
miru=dis(0,m,a,b);
x[2]=a,y[2]=b;
}
if(dis(n,m,a,b) <= mird)
{
mird=dis(n,m,a,b);
x[3]=a,y[3]=b;
}
}
read(hh);
for(int i=1;i<=hh;i++)
{
read(a),read(b);
maxx=0;
for(int j=0;j<4;j++)
maxx=max(maxx,dis(a,b,x[j],y[j]));
if(maxx<ans)
{
ans=maxx;
id=i;
}
}
write(ans),putchar('\n'),write(id),putchar('\n');
return 0;
}
C. Deciphering
二分图的最优匹配,直接上KM模板
// whn6325689
#include <algorithm>
#include <iostream>
#include <iomanip>
#include <cstring>
#include <climits>
#include <complex>
#include <fstream>
#include <cassert>
#include <cstdio>
#include <bitset>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <ctime>
#include <set>
#include <map>
#include <cmath>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef pair<ll, ll> pll;
typedef complex<ld> point;
typedef pair<int, int> pii;
typedef pair<pii, int> piii;
typedef vector<int> vi;
#define CLR(x,y) memset(x,y,sizeof(x))
#define mp(x,y) make_pair(x,y)
#define pb(x) push_back(x)
#define lowbit(x) (x&(-x))
#define MID(x,y) (x+((y-x)>>1))
#define eps 1e-9
#define INF 0x3f3f3f3f
#define LLINF 1LL<<62
template<class T>
inline bool read(T &n)
{
T x = 0, tmp = 1;
char c = getchar();
while((c < '0' || c > '9') && c != '-' && c != EOF) c = getchar();
if(c == EOF) return false;
if(c == '-') c = getchar(), tmp = -1;
while(c >= '0' && c <= '9') x *= 10, x += (c - '0'),c = getchar();
n = x*tmp;
return true;
}
template <class T>
inline void write(T n)
{
if(n < 0)
{
putchar('-');
n = -n;
}
int len = 0,data[20];
while(n)
{
data[len++] = n%10;
n /= 10;
}
if(!len) data[len++] = 0;
while(len--) putchar(data[len]+48);
}
//-----------------------------------
const int MAXN=66;
int n, m;
int adj[MAXN][MAXN];
int labelx[MAXN], usedx[MAXN], lnk[MAXN];
int labely[MAXN], usedy[MAXN];
int mat;
char s1[2000005];
char s2[2000005];
bool path(int i)
{
usedx[i]=1;
for(int j=0; j<m; j++)
{
if(!usedy[j] && adj[i][j]!=-INF && !abs(adj[i][j]-labelx[i]-labely[j]))
{
usedy[j]=1;
if(lnk[j]==-1 || path(lnk[j]))
{
lnk[j]=i;
return true;
}
}
}
return false;
}
int match()
{
mat=0;
CLR(lnk,-1);
CLR(labely,0);
for(int i=0; i<n; i++)
{
labelx[i]=0;
for(int j=0; j<m; j++)
if(adj[i][j] > labelx[i])
labelx[i] = adj[i][j];
}
for(int k=0; k<n; k++)
{
while(1)
{
CLR(usedx,0);
CLR(usedy,0);
if(path(k))
{
mat++;
break;
}
int del=INF;
for(int i=0; i<n; i++)
if(usedx[i])
for(int j=0; j<m; j++)
if(!usedy[j] && adj[i][j]!=-INF)
del=min(del,labelx[i]+labely[j]-adj[i][j]);
if(del==0 || del==INF)
break;
for(int i=0; i<n; i++)
if(usedx[i])
labelx[i] -= del;
for(int j=0; j<m; j++)
if(usedy[j])
labely[j] += del;
}
}
int sum=0;
for(int i=0; i<n; i++)
sum+=labelx[i];
for(int j=0; j<m; j++)
sum+=labely[j];
return sum;
}
int main(void)
{
int len, k;
int a,b;
read(len),read(k);
gets(s1),gets(s2);
n=m=k;
for(int i=0; i<len; i++)
{
if(islower(s1[i]))
a=s1[i]-'a';
else
a=s1[i]-'A'+26;
if(islower(s2[i]))
b=s2[i]-'a';
else
b=s2[i]-'A'+26;
adj[a][b]++;
}
int r=match();
write(r),putchar('\n');
for(int i=0; i<k; i++)
for(int j=0; j<k; j++)
if(lnk[j]==i)
if(j>=26)
printf("%c", j+'A'-26);
else
printf("%c", j+'a');
puts("");
return 0;
}