一、已AC的题
(没参加比赛)
二、赛后想想能过的题
A题
设立两个参数l和r
l表示当前位置‘{’的数量
r表示当前位置‘}’的数量
有
l == 0 '}' r++
l == 0 '{' l++
l > 0 '}' l++
l > 0 '{' l++
当l > 1 && r > 1时(r>1表示在‘{’前有r个‘}’)
ans = (l+r+2)/2
其他情况是 (l+r)/2
#include <iostream>
#include <cstring>
using namespace std;
int l = 0, r = 0, ans, cas = 1;
string str;
int main()
{
cin>>str;
while(str[0] != '-')
{
for(int i = 0; i < (int)str.length(); i++)
{
if(l == 0)
{
if(str[i] == '}') r++;
else l++;
continue;
}
if(l > 0)
{
if(str[i] == '}') l--;
else l++;
continue;
}
}
if(l >= 1 && r >= 1) ans = (r+1)/2 + (l+1)/2;
else ans = l/2 + r/2;
cout<<cas<<". "<<ans<<endl;
cas++;
l = r = 0;
cin>>str;
}
return 0;
}
B题
题目说明略繁琐,注意boss的要求就行,实际就是求最小块的正方形面积,只需w和h除以他们之间的最大公约数,求乘积即可.
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
#define abs(x) ((x)>0?(x):-(x))
#define mset(a, b) memset(a, b, sizeof(a))
#define rep(i, n) for(int i = 0; i < n; i++)
using namespace std;
LL gcd(LL a, LL b){
return b==0?a:gcd(b, a%b);
}
int main()
{
LL w, h;
while(scanf("%I64d%I64d", &w, &h) != EOF)
{
if(0 == w) break;
LL t = gcd(w, h);
printf("%I64d\n", (w/t)*(h/t));
}
return 0;
}
C题
质因数分解,打出1000内所有的质数,每个质数的指数取绝对值之和即距离,不同质数的个数即维度
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
#define abs(x) ((x)>0?(x):-(x))
#define mset(a, b) memset(a, b, sizeof(a))
#define rep(i, n) for(int i = 0; i < n; i++)
using namespace std;
int p[1010], x[1010], y[1010];
int len, n, m;
int cas = 1;
void prime()
{
for (int i = 2; i <= 1000; i ++)
{
if (p[i] == -1) continue;
p[len ++] = i;
for (int j = 2; i * j <= 1000; j ++)
p[i * j] = -1;
}
}
int main()
{
prime();
//for (int i = 2; i <= 100; i ++)
// cout<<p[i]<<" ";
while (scanf("%d%d", &n, &m) != EOF)
{
if (n == 0 && m == 0) break;
int sum = 0, dis = 0;
for (int i = 0; i < len; i ++)
{
int a = 0, b = 0;
while (n % p[i] == 0) a ++, n /= p[i];
while (m % p[i] == 0) b ++, m /= p[i];
if (a | b)
{
sum ++;
dis += abs(a - b);
}
}
if (n != 1) sum ++, dis ++;
if (m != 1) sum ++, dis ++;
if (n == m && n != 1) sum --, dis -= 2;
printf("%d. %d:%d\n", cas, sum, dis);
cas ++;
}
return 0;
}
D题
水的渣渣的题,看题说明写代码即可
#include <iostream>
#include <cmath>
#include <cstring>
#include <cstdio>
#include <algorithm>
#define LL long long
#define abs(x) ((x)>0?(x):-(x))
#define mset(a, b) memset(a, b, sizeof(a))
#define rep(i, n) for(int i = 0; i < n; i++)
using namespace std;
int n, ans;
int cas = 1;
int main()
{
while(scanf("%d", &n) && n != 0)
{
n = n*3;
if(1 == n % 2)
{
n = (n+1)/2;
n = 3*n;
n = n/9;
printf("%d. odd %d\n", cas, n);
cas++;
continue;
}
if(0 == n % 2)
{
n = (n+1)/2;
n = 3*n;
n = n/9;
printf("%d. even %d\n", cas, n);
cas++;
continue;
}
}
return 0;
}
F题
比较简单的计算几何,计算几何一直是弱项,最怕卡精度了。。。还得继续训练。。
#include <iostream>
#include <string>
#include <map>
#include <cstdio>
#include <cstring>
#include <cstdlib>
#include <queue>
#include <cmath>
using namespace std;
const double PI = 3.141;
const double eps = 1e-8;
const int MAXN = 1024;
double dist(double &x1, double &y1, double &x2, double &y2)
{
return (x1 - x2) * (x1 - x2) + (y1 - y2) * (y1 - y2);
}
int sgn(double x) {
return (x > eps) - (x < -eps);
}
struct point
{
double x, y;
bool operator < (const point tp) const { return x < tp.x;}
}p[1005], c1, c2;
int main ()
{
int n;
int cas = 1;
double T;
while (scanf("%d", &n) != EOF)
{
if(n==0) break;
scanf("%lf%lf%lf%lf%lf", &c1.x, &c1.y, &c2.x, &c2.y, &T);
T /= PI;
double x, y;
for(int i=1; i<=n; i++)
{
scanf("%lf%lf", &x, &y);
p[i].x = (x-c1.x)*(x-c1.x)+(y-c1.y)*(y-c1.y);
p[i].y = (x-c2.x)*(x-c2.x)+(y-c2.y)*(y-c2.y);
}
sort(p+1, p+n+1);
int cur, ans = 0;
p[0].x = 0;
for(int i=0; i<=n; i++)
{
x = p[i].x;
y = T - x;
if(sgn(y) < 0) break;
cur = i;
for(int j=i+1; j<=n; j++)
{
if(sgn(y - p[j].y) >= 0) cur ++;
}
if(cur > ans)
{
ans = cur;
}
}
printf("%d. %d\n", cas++, n - ans);
}
return 0;
}
三、能力范围外的题