题解报告(CDUT暑期集训——第五场)
题解报告(CDUT暑期集训——第五场)
B - Beautiful Now
HDU - 6351
-
__思路:直接暴力全排列就行了 最多\(10!\)次 题目限制2500ms 全排列大概是2000多ms(最开始数组开的20疯狂t 结束前十几秒听到尧神说把数组开小过了就马上改了一交过了(%%尧神 时间卡的太死了( __
-
AC代码
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<set>
#include<string>
#include<sstream>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll Pow_mod(ll a, ll b, ll c){
ll ans = 1;
a %= c;
while (b){
if (b & 1) ans = (ans * a) % c;
a = (a * a) % c;
b >>= 1;
}
return (ans % c);
}
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
const int N = 10;
const int M = 20;
const int INF = 0x3f3f3f3f;
int t, k, len, init_val, ans_min, ans_max, cnt, cnt_, sum;
int n_[N], pos[N], vis[N];
char n[M];
void init(){
init_val = 0;
len = strlen(n);
for (int i = 0; i < len; i ++ ){
n_[i] = (n[i] - '0');
pos[i] = i;
init_val = init_val * 10 + n_[i];
}
ans_min = init_val;
ans_max = init_val;
}
bool judge(){
memset(vis, 0, sizeof(vis));
cnt = 0;
for (int i = 0; i < len; i ++ ){
if (!vis[i]){
cnt_ = 0;
while (!vis[i]){
vis[i] = 1;
cnt_ ++;
i = pos[i];
}
cnt += (cnt_ - 1);
}
if (cnt > k) return false;
}
return true;
}
void calc(){
while (next_permutation(pos, pos + len)){
if (n_[pos[0]] && judge()){
sum = 0;
for (int i = 0; i < len; i ++ )
sum = sum * 10 + n_[pos[i]];
ans_min = min(ans_min, sum);
ans_max = max(ans_max, sum);
}
}
}
int main(){
scanf("%d", &t);
while (t -- ){
scanf("%s%d", n, &k);
init();
calc();
printf("%d %d\n", ans_min, ans_max);
}
return 0;
}
E - Everything Has Changed
HDU - 6354
-
思路:水题 计算几何 画图工具一画就出来了 最开始忘了判断包含的情况调过贡献了一发wa(菜是原罪
-
AC代码
#include<stdio.h>
#include<iostream>
#include<math.h>
#include<algorithm>
#include<string.h>
#include<queue>
#include<set>
#include<string>
#include<sstream>
typedef long long ll;
typedef unsigned long long ull;
using namespace std;
ll Pow_mod(ll a, ll b, ll c){
ll ans = 1;
a %= c;
while (b){
if (b & 1) ans = (ans * a) % c;
a = (a * a) % c;
b >>= 1;
}
return (ans % c);
}
int gcd(int a, int b){
return b == 0 ? a : gcd(b, a % b);
}
const double pi = acos(-1);
int t, m;
double R, x, y, r, d, ans, alpha, beta;
int main(){
scanf("%d", &t);
while (t -- ){
scanf("%d%lf", &m, &R);
ans = 2 * pi * R;
while (m -- ){
scanf("%lf%lf%lf", &x, &y, &r);
d = sqrt(x * x + y * y);
if (d >= R + r) continue;
else if (d == R - r) ans += 2 * pi * r;
else if (d > fabs(R - r)){
alpha = 2 * acos((R * R + d * d - r * r) / (2 * R * d));
beta = 2 * acos((d * d + r * r - R * R) / (2 * d * r));
ans += (beta * r - alpha * R);
}
}
printf("%.20lf\n", ans);
}
return 0;
}