您的位置:首页 > 运维架构

Open Ural FU Championship 2013 (2013区域赛练习)

2013-10-20 13:14 309 查看
这应该是欧洲的一场热身赛吧,题目有点水,而且都是1A,可以最后没有把F题调出来。C,E题目前还没A



1981Parallel and PerpendicularOpen Ural FU Championship 2013131355


1982Electrification PlanOpen Ural FU Championship 2013206230
 1983Nectar GatheringOpen Ural FU Championship 2013171872


1984Dummy GuyOpen Ural FU Championship 2013204237
 1985Prime SquareOpen Ural FU Championship 2013171803


1986Paul’s SaladsOpen Ural FU Championship 2013391058


1987Nested SegmentsOpen Ural FU Championship 2013123374


1988Planet Ocean LandingOpen Ural FU Championship 201345918


1989SubpalindromesOpen Ural FU Championship 201369640
贴个F题代码保存一下

高斯消元+STL模拟,代码能力弱成渣

#include <cstdio>
#include <cstring>
#include <cmath>
#include <map>
#include <vector>
#include <queue>
#include <string>
#include <iostream>
#include <algorithm>
using namespace std;
#define pb push_back
#define mp make_pair
int lim;
const double eps = 1e-9;
bool gauss(double a[13][12], int n) {
int i, j, k, r;
for (i = 0; i < n; i++) {
r = i;
for (j = i + 1; j < n; j++)
if (fabs(a[j][i]) > fabs(a[r][i]))
r = j;

if (fabs(a[r][i]) < eps)
return 0;

if (r != i)
for (j = 0; j <= n; j++)
swap(a[r][j], a[i][j]);
for (j = n; j >= i; j--)
for (k = i + 1; k < n; k++)
a[k][j] -= a[k][i] / a[i][i] * a[i][j];
}
for (i = n - 1; i >= 0; i--) {
for (j = i + 1; j < n; j++)
a[i]
-= a[j]
* a[i][j];
a[i]
/= a[i][i];
}
return 1;
}

map<string, int> idx, Right, Left;
char s[100005];
int tot;
string str[11];
vector<pair<string, double> > data[11];
double xs[12][12];
double ff[12][12];
double cs[12][12];
string cf[12];
double ans[12][12];
int n;
char tp[11111];
int main() {
int i, j;
j = 0;
while (scanf("%s", tp) != EOF) {
str
= (string) tp;
if (idx.find(tp) == idx.end())
idx[tp] = tot++;
scanf("%s", tp);
gets(s);
int len = strlen(s);
bool op = 0;
int num;
xs

= 100;
string tmp;
for (i = 1; i < len; i++) {
if (!op) {
tmp.clear();
for (j = i; s[j] != ' ' && j < len; j++)
tmp += s[j];
if (idx.find(tmp) == idx.end())
idx[tmp] = tot++;
i = j;
} else {
num = 0;
for (j = i; s[j] != ' ' && j < len; j++)
num = (num * 10) + s[j] - '0';
data
.pb(make_pair(tmp, num));
i = j;
}
op ^= 1;
}
n++;
}
Right = idx;
for (i = 0; i < n; i++)
if (Right.count(str[i]))
Right.erase(str[i]);
map<string, int>::iterator it;
for (it = Right.begin(); it != Right.end(); it++) {
it->second = lim;
cf[lim++] = it->first;
}
for (i = 0; i < n; i++)
Left[str[i]] = i;

for (i = 0; i < n; i++) {
for (j = 0; j < (int) data[i].size(); j++) {
if (Right.count(data[i][j].first)) {
cs[i][Right[data[i][j].first]] += data[i][j].second;
} else
xs[i][Left[data[i][j].first]] -= data[i][j].second;
}
}
for (i = 0; i < n; i++) {
for (int x = 0; x < lim; x++) {
for (j = 0; j < n; j++) {
xs[j]
= cs[j][x];
memcpy(ff, xs, sizeof(ff));
gauss(ff, n);
for (int k = 0; k < n; k++)
ans[k][x] = ff[k]
;

}
}
}
for (i = 0; i < n; i++) {
printf("%s :", str[i].c_str());
for (j = 0; j < lim; j++) {
printf(" %s %.4f", cf[j].c_str(), ans[i][j]*100);
}
puts("");
}

return 0;

}
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: