1041-1050
1041 Be Unique(20)
#include<cstdio>
#include<vector>
using namespace std;
const int maxn = 10001;
int nums[maxn] = {0};
vector<int> v;
int main(){
int n, k;
scanf("%d", &n);
for(int i = 0; i < n ;i++){
scanf("%d", &k);
nums[k]++;
v.push_back(k);
}
for(auto it = v.begin(); it != v.end(); it++){
if(nums[(*it)] == 1){
printf("%d", (*it));
return 0;
}
}
printf("Nones");
return 0 ;
}
1042 Shuffling Machine(20)
#include<iostream>
using namespace std;
int order[55], value[55], new_value[55];
void change(int n){
char t[5] = {'S', 'H', 'C', 'D', 'J'};
n -= 1;
cout << t[n / 13] << n % 13 + 1;
}
int main(){
int n;
scanf("%d", &n);
for(int i = 1; i <= 54 ; i++){
scanf("%d", &order[i]);
value[i] = i;
}
for(int i = 1; i <= n; i++){
for(int j = 1; j <= 54; j++){
new_value[order[j]] = value[j];
}
for(int j = 1; j <= 54; j++){
value[j] = new_value[j];
}
}
for(int i = 1; i <= 54; i++){
change(value[i]);
if(i != 54){
cout << " ";
}
}
}
1043 Is It a Binary Search Tree(25)
//BST的中序遍历是有序的 给定了前序遍历
//sort后得到中序遍历, 根据中序遍历和前序遍历重建二叉树
#include<iostream>
#include<algorithm>
using namespace std;
struct node{
int data;
node *left, *right;
};
int n, d[1001];
void insert(node* &root, int x){
if(root == NULL){
root = new node;
root -> left = NULL;
root -> right = NULL;
root -> data = x;
return;
}
if(x < root -> data){
insert(root -> left, x);
}else{
insert(root -> right, x);
}
}
//进行先序遍历
int index_pre = 0, index_pre_mirror = 0;
int cnt1 = 0, cnt2 = 0;//控制空格输出
bool dfs(node* &root){
if(root == NULL){
return true;
}
if(root -> data != d[index_pre++]){
return false;
}
return dfs(root -> left) && dfs(root -> right);
}
bool dfs_mirror(node* &root){
if(root == NULL){
return true;
}
if(root -> data != d[index_pre_mirror++]){
return false;
}
return dfs_mirror(root -> right) && dfs_mirror(root -> left);
}
void coutpost(node* &root, bool mirror = false){
if(mirror == false){
if(root == NULL){
return;
}
coutpost(root -> left);
coutpost(root -> right);
cnt1++;
if(cnt1 != 1){
cout << " ";
}
cout << root -> data;
}else{
if(root == NULL){
return;
}
coutpost(root -> right, true);
coutpost(root -> left, true);
cnt2++;
if(cnt2 != 1){
cout << " ";
}
cout << root -> data;
}
}
int main(){
cin >> n;
node *root = NULL;
for(int i = 0; i < n; i++){
cin >> d[i];
insert(root, d[i]);
}
if(dfs(root)){
cout << "YES" << endl;
coutpost(root);
}else if(dfs_mirror(root)){
cout << "YES" << endl;
coutpost(root, true);
}else{
cout << "NO" << endl;
}
}
1044 Shopping in Mars(25)
//每个dp过去超时,后来用vector只dp部分数据,仍然超时
//二分来做
// #include<iostream>
// #include<vector>
// #include<algorithm>
// using namespace std;
// const int maxn = 100001;
// const int INF = 1e9;
// struct ans{
// int left,right;
// ans(int _left, int _right){
// left = _left;
// right = _right;
// };
// };
// vector<ans> v;
// vector<int> temp, temp2;
// // int dp[maxn][maxn]; 内存超限
// int dp[maxn];
// int d[maxn];
// bool cmp(ans a1, ans a2){
// return a1.left < a2.left;
// }
// int main(){
// int n, m, minn = INF;
// cin >> n >> m;
// for(int i = 1; i <= n; i++){
// cin >> d[i];
// dp[i] = d[i];
// temp.push_back(i);
// if(d[i] < minn && d[i] >= m){
// minn = d[i];
// v.clear();
// v.push_back(ans(i,i));
// } else if(d[i] == m){
// v.push_back(ans(i,i));
// }
// }
// for(int len = 2; len <= n; len++){
// // int flag = 0;
// // 超时
// // for(int i = 1; i <= n - len + 1; i++){
// // dp[i] = dp[i] + d[i + len - 1];
// // if(dp[i] < minn && dp[i] >= m){
// // minn = dp[i];
// // v.clear();
// // v.push_back(ans(i, i + len -1));
// // }else if(dp[i] == minn){
// // v.push_back(ans(i, i + len - 1));
// // }
// // if(dp[i] < minn){
// // flag = 1;
// // }
// // }
// // if(flag == 0){
// // break;
// // }
// if(temp.empty()){
// break;
// }
// for(auto it = temp.begin(); it != temp.end(); it++){
// int i = (*it);
// dp[i] = dp[i] + d[i + len - 1];
// if(dp[i] < minn && dp[i] >= m){
// minn = dp[i];
// v.clear();
// v.push_back(ans(i, i + len -1));
// }else if(dp[i] == minn){
// v.push_back(ans(i, i + len - 1));
// }
// if(dp[i] < minn){
// temp2.push_back(i);
// }
// }
// temp = temp2;
// temp2.clear();
// }
// sort(v.begin(), v.end(), cmp);
// for(auto it = v.begin(); it != v.end(); it++){
// cout << (*it).left << "-" << (*it).right << endl;
// }
// return 0;
// }
#include<iostream>
#include<vector>
using namespace std;
const int INF = 1e9;
struct ans{
int left,right;
ans(int _left, int _right){
left = _left;
right = _right;
};
};
vector<ans> v;
vector<int> sum;
int n, m;
void shopping(int i, int &j, int &tempsum){
int left = i, right = n;
while(left < right){
int mid = (right - left) / 2 + left;
if(sum[mid] - sum[i - 1] >= m){
right = mid;
}else{
left = mid + 1;
}
}
j = right;
tempsum = sum[j] - sum[i - 1];
}
int main(){
cin >> n >> m;
sum.resize(n + 1);
for(int i = 1; i <= n; i++){
cin >> sum[i];
sum[i] += sum[i - 1];
}
int minans = INF;
for(int i = 1; i <= n; i++){
int j, tempsum;
shopping(i, j, tempsum);
if(tempsum > minans){
continue;
}
if(tempsum >= m){
if(tempsum < minans){
v.clear();
minans = tempsum;
}
v.push_back(ans(i, j));
}
}
for(auto it = v.begin(); it != v.end(); it++){
cout << (*it).left << "-" << (*it).right << endl;
}
}
1045 Favorite Color Stripe(30)
#include<iostream>
using namespace std;
const int maxn = 10001;
//dp[i][j]表示以 color[i]为最后一个匹配色对于前j个数的最大长度
int color[maxn], line[maxn], dp[maxn][maxn];
int main(){
int n, m, l;
cin >> n;
cin >> m;
for(int i = 1; i <= m; i++){
cin >> color[i];
}
cin >> l;
for(int i = 1; i <= l; i++){
cin >> line[i];
}
for(int i = 1; i <= m; i++){
for(int j = 1; j <= l; j++){
dp[i][j] = max(dp[i][j - 1], dp[i - 1][j]);
if(line[j] == color[i]){
dp[i][j]++;
}
}
}
cout << dp[m][l];
}
1046 Shortest Distance(20)
循环链路上两点的最短路径
// 超时
// #include<cstdio>
// #include<cmath>
// using namespace std;
// const int maxn = 100001;
// int nums[maxn];
// int main(){
// int n, m;
// scanf("%d", &n);
// for(int i = 1; i <= n ; i++){
// scanf("%d", &nums[i]);
// }
// nums[0] = nums[n];
// scanf("%d", &m);
// for(int i = 1; i <= m ; i++){
// int start, end;
// scanf("%d%d", &start, &end);
// if(start > end){
// swap(start, end);
// }
// int ans1 = 0, ans2 = 0;
// for(int j = start; j < end; j++){
// ans1 += nums[j];
// }
// for(int j = end; j % n < start || j <= n; j++){
// ans2 += nums[j % n];
// }
// printf("%d\n", min(ans1, ans2));
// }
// return 0;
// }
#include<cstdio>
#include<cmath>
using namespace std;
const int maxn = 100001;
int nums[maxn];
int main(){
int n, m;
scanf("%d", &n);
int sum = 0;
for(int i = 1; i <= n ; i++){
int temp;
scanf("%d", &temp);
sum += temp;
nums[i] = sum;
}
scanf("%d", &m);
for(int i = 1; i <= m ; i++){
int start, end;
scanf("%d%d", &start, &end);
if(start > end){
swap(start, end);
}
int ans = nums[end - 1] - nums[start - 1];
printf("%d\n", min(ans, sum - ans));
}
return 0;
}
1047 Student List for Course(25)
//为了解决超时可以用c_str()将str转char*
//或者直接不用str 直接用char数组存储name
#include<iostream>
#include<vector>
#include<algorithm>
using namespace std;
const int maxn = 2501;
vector<string> v[maxn];
bool cmp(string s1, string s2){
return s1 < s2;
}
int main(){
int n, m;
cin >> n >> m;
int len, temp;
string name;
for(int i = 1; i <= n; i++){
cin >> name >> len;
for(int j = 1; j <= len; j++){
cin >> temp;
v[temp].push_back(name);
}
}
for(int i = 1; i <= m; i++){
cout << i << " " << v[i].size() << endl;
sort(v[i].begin(), v[i].end(), cmp);
// 超时
// for(int j = 0; j < v[i].size(); j++){
// cout << v[i][j] << endl;
// }
for(auto it = v[i].begin(); it != v[i].end(); it++){
// string 转char* 输出更快 不超时
printf("%s\n",it->c_str());
}
}
}
1048 Find Coins(25)
#include<iostream>
#include<algorithm>
#include<vector>
using namespace std;
// 双指针
// vector<int> v;
// int main(){
// int n, m;
// cin >> n >> m;
// v.resize(n);
// for(int i = 0; i < n; i++){
// cin >> v[i];
// }
// sort(v.begin(), v.end());
// int i = 0, j = n - 1;
// while(i < j){
// if(v[i] + v[j] < m){
// i++;
// }else if(v[i] + v[j] > m){
// j--;
// }else{
// cout << v[i] << " " << v[j] << endl;
// return 0;
// }
// }
// cout << "No Solution";
// return 0;
// }
// 散列表
int a[1001];
int main(){
int n, m, temp;
cin >> n >> m;
for(int i = 0; i < n; i++){
cin >> temp;
a[temp]++;
}
for(int i = 0; i < 1001; i++){
if(a[i]){
a[i]--;//防止重用
if(m > i && a[m - i]){
cout << i << " " << m - i;
return 0;
}
a[i]++;
}
}
cout << "No Solution";
return 0;
}
1049 Counting Ones(30)
//数学题 编程之美 2.4节 1的数目
#include<iostream>
using namespace std;
int main(){
int n;
cin >> n;
int left, right, now;
int a = 1, ans = 0;
while(n / a){
left = n / (a * 10);
now = n / a % 10;
right = n % a;
//cout << left <<" " << now << " " << right << endl;
if(now == 0){
ans += left *a;
}else if(now == 1){
ans += left * a + right + 1;
}else{
ans += left * a + a;
}
a *= 10;
}
cout << ans;
return 0;
}
1050 String Subtraction(20)
#include<iostream>
using namespace std;
bool c[129];
int main(){
string s1, s2;
getline(cin, s1);
getline(cin, s2);
for(int i = 0; i < s2.length(); i++){
c[(int)s2[i]] = true;
}
for(int i = 0; i < s1.length(); i++){
if(c[(int)s1[i]] == false){
cout << s1[i];
}
}
}