水过了两个题。话说这次A题比B题难。。不幸的是A题交了不久就被hack了,好忧桑。先过了B题又去改A题了。我在考虑以后要不要变幻做题顺序。
http://codeforces.com/contest/393/problem/A
题意:给你一个字符串,你可以重新排列他们。问最后这个字符串中最多含有几个“nineteen”。
思路:注意到每个“nineteen”有三个n和e,一个i和t。而且对于“nineteenineteen”前一个“nineteen”与后一个“nineteen”共一个'n'。但是'e,i,t'是不能共用的。所以计算出'i'和't'的最小值t1,优先与'e'的个数比较,再与'n'的个数比较。其中'n'的个数最少要有2*x+1。(x为要求的最多个数).
#include<stdio.h>
#include<string.h>
#include<algorithm>
using namespace std;
char str[110];
int main()
{
while(~scanf("%s",str))
{
int nn = 0,ni = 0, ne = 0, nt = 0;
for(int i = 0; str[i]; i++)
{
if(str[i] == 'n')
nn++;
else if(str[i] == 'i')
ni++;
else if(str[i] == 'e')
ne++;
else if(str[i] == 't')
nt++;
}
int t1 = min(ni,nt);
if(ne >= 3*t1)
{
if(nn >= 2*t1+1)
printf("%d\n",t1);
else
printf("%d\n",(nn-1)/2);
}
else
{
int t2 = ne/3;
if(nn >= t2*2+1)
printf("%d\n",t2);
else printf("%d\n",(nn-1)/2);
}
}
return 0;
}
http://codeforces.com/contest/393/problem/B
题意:把一个矩阵w分成两个矩阵a,b,满足:
a[i][j] = a[j][i]
b[i][j] = -b[j][i]
w[i][j] = w[j][i]
联立以上得:
a[i][j] = a[j][i] = (w[i][j] + w[j][i])/2;
b[i][j] = -b[j][i] = w[i][j]-a[i][j]。
#include <stdio.h>
#include <string.h>
const int maxn = 180;
int w[maxn][maxn];
double a[maxn][maxn],b[maxn][maxn];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
scanf("%d",&w[i][j]);
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j <= n; j++)
{
if(i == j)
{
a[i][j] = w[i][j]*1.0;
b[i][j] = 0;
}
else
{
a[j][i] = a[i][j] = (w[i][j]+w[j][i])*1.0/2;
b[i][j] = w[i][j]-a[i][j];
b[j][i] = -b[i][j];
}
}
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < n; j++)
printf("%.8lf ",a[i][j]);
printf("%.8lf\n",a[i][n]);
}
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < n; j++)
printf("%.8lf ",b[i][j]);
printf("%.8lf\n",b[i][n]);
}
}
return 0;
}