比赛题目
Round decimals
题意:本题大致就是给你一个数字,然后四舍五入转化成一个整数,因为类型转换会去掉小数部分,并不会直接入一位
解题方法:直接对该数字加上0.5然后再类型转换即可。
//也不知道自己做题的时候为什么没有这么好的思路,我是菜狗
#include <iostream>
#include <cmath>
using namespace std;
int main(){
float a;
scanf("%f", &a);
printf("%d", (int)(a+0.5);
return 0;
}
Counting Arrays
本题题意:给定n个序列,判断不重复序列的个数
解题思路:利用set的去重复特性,将序列(用vector数组存储序列)当作元素存进set中,最后返回set的长度即可
/*
这个set用的就很巧妙,要是我掌握的熟一点也不至于……
不过新学了一个高级的for循环<笑哭>
for(auto &x : arr) 可以用来输入
for(auto x : arr) 可以用来输出
比我之前那个for快多了
*/
#include <iostream>
#include <vector>
#include <set>
using namespace std;
int main(){
int n, m, x;
scanf("%d", &n);
set<vector<int>> se;
for(int i=0; i<n; i++){
scanf("%d", &m);
vector<int> arr(m);
for(auto &x : arr) scanf("%d", &x);
se.insert(arr);
}
printf("%d", se.size());
return 0;
}
The baggage
本题题意:现有五种不同重量(分别为1、2、3、4、5)的包裹和最多能扛动五种不同重量的包裹的人(这五类人分别能扛动1、2、3、4、5这些重量的包裹)。给定任意数量、任意重量的包裹,并有任意数量能扛动任意重量的人,问这些人能否将这些包裹扛起来
解题思路:先将所有重量为5的包裹分配给能扛动5个重量的人,判断是否能重量为5的包裹扛完。接下来将所有重量为4的包裹分配给能扛动4个重量的人,如果包裹有剩余,则分配给没有扛包裹的能扛动重量为5的包裹的人,然后再将所有重量为3的包裹分配给能扛动3个重量的人,将剩余包裹分配给能扛动质量为5的人,如果还有剩余,分配给能扛动质量4的人。将上述步骤进行递归操作,即可对该问题作出初步判断。最后就是考虑重量为1、2的包裹剩余的情况,将其对应的分配到能扛动质量为3、4、5并有余力扛质量为1、2的包裹的人,最后即可得到结果。
#include <bits/stdc++.h>
using namespace std;
#define N 200010
#define MOD (ll)998244353
#define ll long long
#define rep(i, n) for(int i = 0; i < n; ++i)
ll a[6];
ll b[6];
void pack(ll x, ll y) {
ll c = min(a[x], b[y]);
a[x] -= c;
b[y] -= c;
b[y - x] += c;
return;
}
int main(void) {
ll t;
bool ans;
cin >> t;
rep(tt, t) {
rep(i, 5)cin >> a[i + 1];
rep(i, 5)cin >> b[i + 1];
a[0] = 0;
b[0] = 0;
pack(5, 5);
pack(4, 4);
pack(4, 5);
pack(3, 3);
pack(3, 5);
pack(3, 4);
rep(i, 4)pack(2, 5 - i);
rep(i, 5)pack(1, 5 - i);
ans = true;
rep(i, 5)if (a[i + 1] > 0)ans = false;
if (ans)cout << "Yes" << endl;
else cout << "No" << endl;
}
return 0;
}