牛客網は数年来コンピュータの大学院受験の再試験の上で機題のオンライン練習をします
成績ソート
プロキシサーバ
携帯キーボード
球の半径とボリューム
成績ソート
ツリー遍歴
マヤ人のパスワード
最小最大数を求める
#include
#include
#include
#include
using namespace std;
struct Node {
string name;
int score;
} node[500];
bool cmp(const Node& a, const Node& b) {
return a.score < b.score;
}
bool cmp1(const Node& a, const Node& b) {
return a.score > b.score;
}
int main() {
int n, type;
while (scanf("%d%d", &n, &type) == 2) {
for (int i = 0; i < n; i++) {
cin >> node[i].name >> node[i].score;
}
if (type == 1) {
stable_sort(node, node+n, cmp);
} else if(type == 0) {
stable_sort(node, node+n, cmp1);
}
for (int i = 0; i < n; i++) {
cout << node[i].name << " " << node[i].score << endl;
}
}
return 0;
}
プロキシサーバ
#include
#include
#include
using namespace std;
int solve(char p[][16], int n, char q[][16], int m) {
int Max = -1;
int i, j;
for (i = 0; i < n; i++) {
for (j = 0; j < m; j++) {
if (!strcmp(p[i], q[j])) {
Max = max(j, Max);
break;
}
}
if (j == m)
return 0;
}
if (n == 1 && Max != -1) // ,
return -1;
return 1 + solve(p, n, q+Max, m-Max);
}
int main() {
int n, m;
char p[1005][16];
char q[5005][16];
cin >> n;
for (int i = 0; i < n; i++) {
scanf("%s", p[i]);
}
cin >> m;
for (int i = 0; i < m; i++) {
scanf("%s", q[i]);
}
cout << solve(p, n, q, m) << endl;
return 0;
}
携帯キーボード
#include
#include
using namespace std;
int pos[26][2] = {{1,1},{1,2},{1,3},{2,1},{2,2},{2,3},{3,1},{3,2},{3,3},
{4,1},{4,2},{4,3},{5,1},{5,2},{5,3},{6,1},{6,2},{6,3},{6,4},
{7,1},{7,2},{7,3},{8,1},{8,2},{8,3},{8,4}}; //
int main() {
string str = "";
while (cin >> str) {
int time = 0;
for (int i = 0 ; i < str.length(); i++) {
if (i == 0) {
time += pos[str[0]-'a'][1]; // ,
} else {
if (pos[str[i]-'a'][0] == pos[str[i-1]-'a'][0]) {
time += 2; //
}
time += pos[str[i]-'a'][1];
}
}
cout << time << endl;
}
return 0;
}
球の半径とボリューム
#include
#include
#include
using namespace std;
const double PI = acos(-1);
int main() {
int cx, cy, cz, px, py, pz;
while (scanf("%d%d%d%d%d%d", &cx, &cy, &cz, &px, &py, &pz) == 6) {
double radius = sqrt((px-cx)*(px-cx) + (py-cy)*(py-cy) + (pz-cz)*(pz-cz));
double area = PI*radius*radius*radius*4/3;
printf("%.3f %.3f
", radius, area);
}
return 0;
}
成績ソート
#include
#include
using namespace std;
struct Stu {
int id;
int score;
};
bool cmp(const Stu& a, const Stu& b) {
if (a.score == b.score)
return a.id < b.id;
return a.score < b.score;
}
int main() {
int n;
Stu stu[105];
while (cin >> n) {
for (int i = 0; i < n; i++) {
cin >> stu[i].id >> stu[i].score;
}
sort(stu, stu+n, cmp);
for (int i = 0; i < n; i++) {
cout << stu[i].id << " " << stu[i].score << endl;
}
}
return 0;
}
ツリー遍歴
#include
using namespace std;
struct TreeNode {
TreeNode* left;
TreeNode* right;
char val;
TreeNode(char c) : val(c), left(NULL), right(NULL){}
};
TreeNode* createTree(string str, int & index) { //
TreeNode *r = NULL;
if (index < str.length() && str[index] != '#') {
r = new TreeNode(str[index]);
r->left = createTree(str, ++index);
r->right = createTree(str, ++index);
}
return r;
}
void InOrderTraverse(TreeNode* root) {
if (root == NULL)
return;
InOrderTraverse(root->left);
cout << root->val << " ";
InOrderTraverse(root->right);
}
int main() {
string str;
while (cin >> str) {
int index = 0;
TreeNode* root = createTree(str, index);
InOrderTraverse(root);
cout << endl;
}
return 0;
}
マヤ人のパスワード
#include
#include
#include
#include
using namespace std;
char aim[] = {'2', '0', '1', '2'};
typedef pair<string, int> _pair;
int n;
bool judge(string str) {
int len = str.length();
for (int i = 0; i < len-3; i++) {
if (str[i] == '2' && str[i+1] == '0' && str[i+2] == '1' && str[i+3] == '2')
return true;
}
return false;
}
int BFS(string str) {
queue<_pair/> q;
set<string> s;
q.push(make_pair(str, 0));
while (!q.empty()) {
_pair p = q.front();
q.pop();
string tmp = p.first;
if (judge(tmp)) {
return p.second;
} else {
for (int i = 0; i < n-1; i++) {
swap(tmp[i], tmp[i+1]);
if (!s.count(tmp)) {
q.push(make_pair(tmp, p.second+1));
s.insert(tmp);
}
swap(tmp[i], tmp[i+1]);
}
}
}
return -1;
}
int main() {
while (cin >> n) {
string str;
cin >> str;
cout << BFS(str) << endl;
}
return 0;
}
最小最大数を求める
#include
#include
using namespace std;
int main() {
int n, x;
int mini = 1000001;
int maxi = -1000001;
while (scanf("%d", &n) != EOF) {
while (n--) {
scanf("%d", &x);
if (x < mini)
mini = x;
if (x > maxi)
maxi = x;
}
printf("%d %d
", maxi, mini);
}
return 0;
}