E:点击打开链接
开始的时候a.s = s;错误;结构体排序忘了,用的冒泡,各种不爽啊当时;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<vector>
using namespace std;
const int maxn = 200 + 5;
struct person
{
char s[55];
int kill;
int major;
int minor;
}vis[maxn];
vector<string> res;
int main()
{
int N;
while(cin >> N && N)
{
memset(vis,0,sizeof(vis));
res.clear();
for(int i = 0; i < N;i++)
{
char s[55];
int kill;
cin >> s >> kill;
memcpy(vis[i].s, s, sizeof(s));
vis[i].kill = kill;
}
for(int i = 0; i < N-1; ++i)
{
for(int j = i + 1; j <N;++j )
{
person tmp;
if(vis[i].kill < vis[j].kill)
{
tmp = vis[i];
vis[i]= vis[j];
vis[j] = tmp;
}
else if(vis[i].kill == vis[j].kill && strcmp(vis[i].s, vis[j].s) == 1)
{
tmp = vis[i];
vis[i]= vis[j];
vis[j] = tmp;
}
}
}
for(int i = 0; i < N; ++i)
{
cout << vis[i].s << " " << vis[i].kill << endl;
}
int M;
cin >> M;
for(int i = 0; i < M;++i)
{
char ss[55];
cin >> ss;
int ok;
for(int i = 0; i < N;++i)
{
if(strcmp(ss,vis[i].s) == 0) { ok = vis[i].kill;break;}
}
int a = 1, b = 1;
for(int i = 0; i < N; ++i)
{
if(vis[i].kill > ok) ++a;
else if(vis[i].kill == ok)
{
if(strcmp(vis[i].s, ss) == -1) ++b;
}
}
cout << a;
if(b != 1)
{
cout << " " << b <<endl;
}
else cout <<"\n";
}
}
return 0;
}
I:
点击打开链接
贪心; 状态压缩;
#include<cstdio>
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#define EPS 1e-6
using namespace std;
const int maxn = 10000;
int res[maxn];
int used[maxn];
int n;
double sum = 0;
int ok(int a, int b, int c)
{
int kkk[3];
kkk[0] = a;
kkk[1] = b;
kkk[2] = c;
sort(kkk,kkk+3);
a = kkk[0];
b = kkk[1];
c = kkk[2];
if(a+b <= c || c- a > b || c-b>a) return 0;
return 1;
}
int main()
{
while(cin >> n &&n)
{
memset(used,0,sizeof(used));
for(int i = 1; i <= n;++i) cin >> res[i];
int k = n/3;
sum = 0;
while(k--)
{
double tmp = 0;
int a = 0, b = 0, c =0;
for(int i = 1; i <= n; ++i)
{
for(int j = i + 1; j <= n;++j)
{
for(int kk = j + 1; kk <= n;++kk)
{
if(!used[i] && !used[j] && !used[kk] && ok(res[i], res[j], res[kk]))
{
double kkkk = double(res[i]+res[j]+res[kk])/2;
double t = kkkk * (kkkk-(double)res[i]) * (kkkk-(double)res[j]) * (kkkk-(double)res[kk]);
if(tmp < t)
{
a = i;
b = j;
c = kk;
tmp = t;
}
}
}
}
}
used[a] = used[b] = used[c] = 1;
sum += sqrt(tmp);
}
printf("%.2lf\n", sum);
}
return 0;
}
状态压缩:
#include<cstdio>
#include<iostream>
#include<algorithm>
#include<cstring>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = (1<<13) - 1;
int n;
double dp[maxn];
int res[13];
vector<int>v;
double area(int a, int b, int c)
{
if(a+b <= c) return 0.0;
else
{
double p = (a + b + c) * 0.5;
return sqrt(p * (p-a) * 1.0 * (p-b) * 1.0 * (p-c) * 1.0);
}
}
int main()
{
while(cin >> n && n)
{
memset(dp,0,sizeof(dp));
v.clear();
for(int i = 0; i < n; ++i) cin >> res[i];
sort(res,res+n);
for(int i = 0; i < n; ++i)
{
for(int j = i + 1; j < n;++j)
{
for(int k = j + 1; k < n;++k)
{
int st = (1<<i) | (1<<j) | (1<<k);
dp[st] = area(res[i], res[j], res[k]);
if(res[i] + res[j] > res[k]) v.push_back(st);
}
}
}
int max_case = 0;
for(int i = 0; i < (1<<n); ++i)
{
for(int j = 0; j < (int)v.size(); ++j)
{
if((i&v[j])) continue;
dp[(i|v[j])] = max(dp[(i|v[j])], dp[i] + dp[v[j]]);
}
}
printf("%.2lf\n", dp[(1<<n) - 1]);
}
return 0;
}
K: 点击打开链接
很久没有bfs了
#include<cstdio>
#include<iostream>
#include<cstring>
#include<queue>
#include<algorithm>
using namespace std;
#define INF 0x3f3f3f3f
const int maxn = 300 + 5;
int d[maxn][maxn];
int tmp[maxn][maxn];
int res[maxn][maxn];
int N, M;
int bfs(int i)
{
queue<int> que;
while(!que.empty()) que.pop();
for(int j = 2; j <= N; ++j)
if(res[1][j] != 0 && j != i)
que.push(j);
int haved[maxn];
memset(haved,0,sizeof(haved));
while(!que.empty())
{
int d = que.front();que.pop();
if(d == N) return 1;
haved[d] = 1;
for(int j = 2; j <= N; ++j)
if(res[d][j] != 0 && !haved[j] && j != i)
que.push(j);
}
return 0;
}
int Floyd_Warshall(int kk)
{
for(int k = 1; k <= N; ++k)
{
if(k == kk)continue;
for(int i = 1; i <= N; ++i)
{
for(int j = 1; j <= N; ++j)
{
tmp[i][j] = min(tmp[i][j], tmp[i][k] + tmp[k][j]);
}
}
}
return tmp[1][N];
}
int main()
{
while(cin >> N >> M)
{
memset(d,INF,sizeof(d));
memset(res,0,sizeof(res));
if(N==0 && M==0) return 0;
if(M==0 && N != 0) {cout << "Inf" << endl;continue;}
for(int i = 0; i < M;++i)
{
int u, v, k;
cin >> u >> v;
cin >> k;
d[u][v] = k;
d[v][u] = k;
res[u][v] = 1;
res[v][u] = 1;
}
bool ok = true;
for(int i = 2; i <= N-1; ++i)
{
if(!bfs(i)){ok = false; break;}
}
if(!ok) {cout << "Inf" << endl;continue;}
int sum = 0;
memcpy(tmp,d,sizeof(d));
for(int i = 2; i <= N-1; ++i)
{
sum = max(sum, Floyd_Warshall(i));
memcpy(tmp,d,sizeof(d));
}
cout << sum << endl;
}
return 0;
}