水过了两个题。话说这次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; }