1081-1090
1081 Rational Sum(20)
#include<cstdio>
#include<cmath>
using namespace std;
int gcd(int a, int b){
// return b > 0 ? gcd(b, a % b) : a;
return b == 0 ? abs(a) : gcd(b, a % b);
}
int main(){
int n, a, b, suma = 0, sumb = 1;
scanf("%d",&n);
for(int i = 0; i < n ;i++){
scanf("%d/%d", &a, &b);
int temp = gcd(a, b);
a /= temp;
b /= temp;
suma = a * sumb + b * suma;
sumb = sumb * b;
temp = gcd(suma, sumb);
suma /= temp;
sumb /= temp;
}
int ans = suma / sumb;
suma = suma - (sumb * ans);
if(ans != 0){
printf("%d", ans);
if(suma != 0 ){
printf(" ");
}
}
if(suma != 0){
printf("%d/%d", suma, sumb);
}
if(ans == 0 && suma == 0){
printf("0");
}
return 0;
}
1082 Read Number in Chinese(25)
//from liuchuo
#include <iostream>
#include <string>
#include <vector>
using namespace std;
string num[10] = { "ling","yi", "er", "san", "si", "wu", "liu", "qi", "ba", "jiu" };
string c[6] = { "Ge","Shi", "Bai", "Qian", "Yi", "Wan" };
int J[] = {1, 10, 100, 1000, 10000, 100000, 1000000, 10000000, 100000000};
vector<string> res;
int main() {
int n;
cin >> n;
if (n == 0) {
cout << "ling";
return 0;
}
if (n < 0) {
cout << "Fu ";
n = -n;
}
int part[3];
part[0]= n / 100000000;
part[1]= (n % 100000000) / 10000;
part[2] = n % 10000;
bool zero = false; //是否在非零数字前输出合适的ling
int printCnt = 0; //用于维护单词前没有空格,之后输入的单词都在前面加一个空格。
for (int i = 0; i < 3; i++) {
int temp = part[i]; //三个部分,每部分内部的命名规则都一样,都是X千X百X十X
for (int j = 3; j >= 0; j--) {
int curPos = 8 - i * 4 + j; //当前数字的位置
if (curPos >= 9) continue; //最多九位数
int cur = (temp / J[j]) % 10;//取出当前数字
if (cur != 0) {
if (zero) {
printCnt++ == 0 ? cout<<"ling" : cout<<" ling";
zero = false;
}
if (j == 0)
printCnt++ == 0 ? cout << num[cur] : cout << ' ' << num[cur]; //在个位,直接输出
else
printCnt++ == 0 ? cout << num[cur] << ' ' << c[j] : cout << ' ' << num[cur] << ' ' << c[j]; //在其他位,还要输出十百千
} else {
if (!zero&&j != 0 && n / J[curPos] >= 10) zero = true; //注意100020这样的情况
}
}
if (i != 2 && part[i]>0) cout << ' ' << c[i + 4]; //处理完每部分之后,最后输出单位,Yi/Wan
}
return 0;
}
1083 List Grades(25)
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 1;
struct student{
string name, id;
int grade;
}stu[maxn];
bool cmp(student s1, student s2){
return s1.grade > s2.grade;
}
int main(){
int n;
int grade1, grade2;
cin >> n;
for(int i = 0; i < n; i++){
cin >> stu[i].name >> stu[i].id >> stu[i].grade;
}
cin >> grade1 >> grade2;
sort(stu, stu + n, cmp);
int flag = 0;
for(int i = 0; i < n; i++){
if(stu[i].grade >= grade1 && stu[i].grade <= grade2){
cout << stu[i].name << " " << stu[i].id << endl;
flag = 1;
}
}
if(flag == 0){
cout << "NONE";
}
}
1084 Broken Keyboard(20)
#include<iostream>
#include<string>
using namespace std;
int main(){
string s1, s2, ans;
getline(cin, s1);
getline(cin, s2);
for(auto ch: s1){
if(s2.find(ch) == string::npos &&
ans.find(toupper(ch)) == string::npos){
ans += toupper(ch);
}
}
cout << ans;
}
1085 Perfect Sequence(25)
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 1e5 + 1;
vector<int> v;
int main(){
long long p;//测试点5爆int了
int n;
cin >> n >> p;
v.resize(n);
for(int i = 0; i < n; i++){
cin >> v[i];
}
sort(v.begin(), v.end());
int len = 1;
for(int i = 0; i < n; i++){
while(i + len < n && v[i] * p >= v[i + len]){
len++;
}
}
cout << len;
}
1086 Tree Traversals Again(25)
#include<iostream>
#include<vector>
#include<stack>
using namespace std;
struct TreeNode{
int val;
TreeNode *left, *right;
TreeNode(int _val){
val = _val;
left = right = NULL;
}
};
int n;
vector<int> preorder, inorder;
stack<int> s;
int space_flag = 0;
TreeNode *buildTree(int preBegin,int preEnd,vector<int>& inorder,int inBegin, int inEnd){
if(preBegin > preEnd || inBegin > inEnd)
return nullptr;
TreeNode* root = new TreeNode(preorder[preBegin]);
int index=inBegin,leftPreEnd=0;
for(;index<=inEnd&&preorder[preBegin]!=inorder[index]; ++index) ++leftPreEnd;
root->left = buildTree(preBegin+1,preBegin+leftPreEnd,inorder,inBegin,index-1);
root->right = buildTree(preBegin+1+leftPreEnd,preEnd,inorder,index+1,inEnd);
return root;
}
void postorder(TreeNode* root){
if(root -> left){
postorder(root -> left);
}
if(root -> right){
postorder(root -> right);
}
if(space_flag == 0){
cout << root -> val;
space_flag = 1;
}else{
cout << " ";
cout << root -> val;
}
}
int main(){
cin >> n;
string opt;
int optnum;
for(int i = 1; i <= 2 * n; i++){
cin >> opt;
if(opt == "Push"){
cin >> optnum;
preorder.push_back(optnum);
s.push(optnum);
}else{
optnum = s.top();
inorder.push_back(optnum);
s.pop();
}
}
TreeNode* root = buildTree(0, preorder.size()-1, inorder,0,inorder.size()-1);
postorder(root);
}
1087 All Roads Lead to Rome(30)
#include<iostream>
#include<map>
#include<vector>
using namespace std;
const int maxn = 201;
const int INF = 1e8;
int weight[maxn], adj[maxn][maxn],dis[maxn];
bool visit[maxn] = {false};
map<string, int> m;
map<int, string> m2;
vector<int> pre[maxn], temppath, path;
int maxvalue = 0, cntpath = 0;
double maxavg = 0;
void dfs(int v){
temppath.push_back(v);
if(v == 0){
int value = 0;
for(int i = 0; i < temppath.size(); i++){
value += weight[temppath[i]];
}
double tempavg = 1.0 * value / (temppath.size() - 1);
if(value > maxvalue){
maxvalue = value;
path = temppath;
maxavg = tempavg;
}else if(value == maxvalue && tempavg > maxavg){
maxavg = tempavg;
path = temppath;
}
temppath.pop_back();
cntpath++;
return;
}
for(int i = 0; i < pre[v].size(); i++){
dfs(pre[v][i]);
}
temppath.pop_back();
}
int main(){
fill(dis, dis + maxn, INF);
fill(weight, weight + maxn, 0);
fill(adj[0], adj[0] + maxn * maxn, INF);
fill(visit, visit + maxn, false);
int n, k;
string start;
cin >> n >> k >> start;
m[start] = 0;
m2[0] = start;
for(int i = 1; i <= n - 1; i++){
string temp_city;
int temp_happiness;
cin >> temp_city >> temp_happiness;
m[temp_city] = i;
m2[i] = temp_city;
weight[i] = temp_happiness;
}
for(int i = 1; i <= k; i++){
string city1, city2;
int val;
cin >> city1 >> city2 >> val;
adj[m[city1]][m[city2]] = val;
adj[m[city2]][m[city1]] = val;
}
dis[0] = 0;
for(int i = 0; i <= n - 1; i++){
int u = -1, minn = INF;
for(int j = 0; j <= n - 1; j++){
if(!visit[j] && dis[j] < minn){
u = j;
minn = dis[j];
}
}
if(u == -1){
break;
}
visit[u] = true;
for(int v = 0; v <= n - 1; v++){
if(!visit[v] && adj[u][v] != INF){
if(dis[u] + adj[u][v] < dis[v]){
dis[v] = dis[u] + adj[u][v];
pre[v].clear();
pre[v].push_back(u);
}else if(dis[u] + adj[u][v] == dis[v]){
pre[v].push_back(u);
}
}
}
}
int rom = m["ROM"];
dfs(rom);
printf("%d %d %d %d\n", cntpath, dis[rom], maxvalue, (int)maxavg);
for(int i = path.size() - 1; i >= 1; i--){
cout << m2[path[i]] << "->";
}
cout << "ROM";
return 0;
}
1088 Rational Arithmetic(20)
//写不动 直接抄了
#include<cstdio>
#include<cmath>
//int 不够
#define ll long long
using namespace std;
ll gcd(ll a, ll b){
return b == 0 ? a : gcd(b, a % b);
}
void func(ll m, ll n){
if(m * n == 0){
printf("%s", n == 0 ? "Inf" : "0");
return;
}
bool flag = ((m < 0 && n > 0) || (m > 0 && n < 0));
m = abs(m);
n = abs(n);
ll x = m / n;
printf("%s", flag ? "(-":"");
if(x != 0) printf("%lld", x);
if(m % n == 0){
if(flag) printf(")");
return;
}
if(x != 0) printf(" ");
m = m - x * n;
ll t = gcd(m, n);
m = m / t;
n = n / t;
printf("%lld/%lld%s", m, n, flag ? ")":"");
}
int main(){
ll a, b, c, d;
scanf("%lld/%lld %lld/%lld", &a, &b, &c, &d);
func(a, b); printf(" + "); func(c, d); printf(" = "); func(a * d + b * c, b * d); printf("\n");
func(a, b); printf(" - "); func(c, d); printf(" = "); func(a * d - b * c, b * d); printf("\n");
func(a, b); printf(" * "); func(c, d); printf(" = "); func(a * c, b * d); printf("\n");
func(a, b); printf(" / "); func(c, d); printf(" = "); func(a * d, b * c);
return 0;
}
1089 Insert or Merge(25)
#include<iostream>
#include<cmath>
#include<vector>
#include<algorithm>
using namespace std;
vector<int> v1, v2;
int n;
bool judge(){
for(int i = 0; i < n; i++){
if(v1[i] != v2[i]){
return false;
}
}
return true;
}
void insert_once(vector<int> &v){
vector<int> temp;
int pos = -1;
auto right = v.begin();
for(int i = 0; i < v.size() - 1; i++){
right++;
if(v[i] > v[i + 1]){
pos = i;
break;
}
}
if(pos == -1){
return;
}
sort(v.begin(), ++right);
// 非sort实现插入排序
// int newpos = -1;
// for(int i = 0; i <= pos; i++){
// if(v[i] < v[pos + 1]){
// temp.push_back(v[i]);
// }else{
// temp.push_back(v[pos + 1]);
// newpos = i;
// break;
// }
// }
// for(int i = newpos; i <= pos; i++){
// temp.push_back(v[i]);
// }
// for(int i = pos + 2; i < v.size(); i++){
// temp.push_back(v[i]);
// }
// v= temp;
}
void merge_once(vector<int> &v){
int len = 1;
bool flag = true;
while(flag){
len *= 2;
for(int i = 0; i < v.size(); i+=len){
for(int j = i; j < min(i + len - 1, int(v.size() - 1));j++){
if(v[j] > v[j + 1]){
flag = false;
break;
}
}
}
}
vector<int>::iterator left,right;
left = right = v.begin();
if(len > v.size()){
sort(v.begin(), v.end());
return;
}
for(int i = 0; i < v.size() / len; i++){
for(int j = 0; j < len; j++){
if(i != 0){
left++;
}
right++;
}
sort(left, right);
}
sort(right, v.end());
// for(int i = 0; i < v.size() ; i+=len){
// sort(left, right);
// if(i + len + len > v.size()){
// right = v.end();
// for(int j = 0; j < len; j++){
// left++;
// }
// }else{
// for(int j = 0; j < len; j++){
// left++;
// right++;
// }
// }
// }
}
bool insert_sort(){
for(int i = 0; i < n; i++){
if(judge()){
return true;
}
insert_once(v1);
}
return false;
}
int main(){
cin >> n;
v1.resize(n);
v2.resize(n);
for(int i = 0; i < n; i++){
cin >> v1[i];
}
for(int i = 0; i < n; i++){
cin >> v2[i];
}
if(insert_sort()){
insert_once(v2);
cout << "Insertion Sort\n";
for(int i = 0; i < n; i++){
if(i != 0){
cout << " ";
}
cout << v2[i];
}
return 0 ;
}else{
merge_once(v2);
cout << "Merge Sort\n";
for(int i = 0; i < n; i++){
if(i != 0){
cout << " ";
}
cout << v2[i];
}
return 0;
}
}
1090 Highest Price in Supply Chain(25)
#include<iostream>
#include<vector>
#include<cmath>
using namespace std;
const int maxn = 1e5 + 1;
int maxnum, maxdepth;
vector<int> v[maxn];
void dfs(int index, int depth){
if(v[index].size() == 0){
if(maxdepth == depth){
maxnum++;
}
if(maxdepth < depth){
maxdepth = depth;
maxnum = 1;
}
return;
}
for(int i = 0; i < v[index].size(); i++){
dfs(v[index][i], depth + 1);
}
}
int main(){
int n;
double p, r;
cin >> n >> p >> r;
int root, temp;
for(int i = 0; i < n; i++){
cin >> temp;
if(temp == -1){
root = i;
}else{
v[temp].push_back(i);
}
}
dfs(root, 0);
printf("%.2f %d", p * pow(1 + r / 100, maxdepth), maxnum);
}