1.
一、无人机打靶
题目描述
有𝑁支队伍参赛,每个队伍的无人机成绩为𝑆,且每个无人机颜色被随机涂为蓝(b)、红(r)、绿(g)、紫(p)之一。
输入格式
第一行包含整数𝑁,表示参加的队伍数目,即无人机数目。
接下来𝑁行,每行包含每支参赛队伍的无人机颜色和打靶成绩𝑆,由空格分隔开。
输出格式
输出内容由两部分组成。
第一部分输出各种颜色对应的无人机数目。
第二部分根据按照成绩从大到小进行排序,输出无人机打靶成绩𝑆和对应的无人机颜色。
数据范围
1<=𝑁<=30
0<=𝑆<=100
输入样例
5
b 80
p 95
b 85
g 90
r 90
输出样例
blue 2
green 1
purple 1
red 1
95 purple
90 green
90 red
85 blue
80 blue
#include <bits/stdc++.h>
using namespace std;
unordered_map<char,string> h{{'b',"blue"},{'r',"red"},{'g',"green"},{'p',"purple"}};
const int N = 40 ;
struct Plane
{
string s;
int sore;
bool operator < (const Plane & t) const
{
return sore > t.sore ;
}
}a[N];
struct Color
{
char c ;
int times;
bool operator < (const Color & t) const
{
if (times != t.times) return times > t.times ;
else return c < t.c ;
}
}ans[4] = {{'b',0},{'r',0},{'p',0},{'g',0}};
int main()
{
int n ;
cin >> n ;
for (int i = 0 ; i < n ; i ++)
{
char s ;
int x ;
cin >> s >> x ;
string str = h[s];
a[i] = {h[s] , x};
for (int i = 0 ; i < 4 ; i ++)
{
if (ans[i].c == s)
{
ans[i].times ++ ;
break;
}
}
}
sort(a , a + n);
sort(ans , ans + 4);
for (int i = 0 ; i < 4 ; i ++)
cout << h[ans[i].c] << ' ' << ans[i].times << endl ;
for (int i = 0 ; i < n ; i ++)
{
auto x = a[i];
cout << x.sore << ' ' << x.s << endl ;
}
return 0 ;
}
2
二、顺子
从扑克牌中抽取5张,其中A、J、Q、K分别表示1、11、12、13,大小王用 0 表示,如果五张牌可以连成顺序则称为顺子,大小王可以表示任意数字。现在输入五张牌的牌面,判断是否为顺子。
#include <bits/stdc++.h>
using namespace std;
int a[5];
int main()
{
for (int i = 0 ; i < 5 ; i ++) cin >> a[i];
sort(a, a + 5);
for (int i = 1 ; i < 5 ; i ++)
{
if (a[i] - a[i - 1] != 1)
{
cout << "不是顺子" << endl;
return 0 ;
}
}
cout << "是顺子" << endl;
return 0;
}
3. acwing 12.背包问题求具体方案(模板加以修改)
计算机视觉算法:
检测获取一组候选物体,每个物体具有一个特征值,其中 Wi 为正整数,现研究基于特征值选取物问题,表示为< s, c >,s={W1, W2, …, Wn},表示候选物体的特征值集合,其中 Wi 为正整数,表示第i个物品的特征值;C为正整数,代表需达到目标特征值。要求编程寻找s的子集,使子集中物体的特征值之和为 C.
程序输入模式:
第一行包括 2 个正整数 N 和 C,N 代表 S 中候选物体总数,C 代表需要达到目标特征值;第二行包括N个正整数(1≤N≤100),代表 S。
程序输出格式为:
满足条件的 S 的子集(1行1个),或者当问题无解时,输出“None”。
输入样例
5 6
1
2
3
2
3
输出样例
(输出的是s内每个物体的序号,并不是每个物体的特征值)
1 2 3
1 2 5
1 3 4
1 4 5
3 5
#include <bits/stdc++.h>
using namespace std;
const int N = 1010;
int n, m;
int v[N];
int f[N][N];
int used[N][N]; // 用于标记f[i][j]这个状态是通过哪种方式转移过来的,0表示不选物品i,1表示选物品i
vector<vector<int>> allPlans; // 用于存储所有的方案,每个方案是一个vector<int>表示选择的物品编号
// 递归回溯函数
void dfs(int i, int j, vector<int>& plan) {
if (i > n) {
allPlans.push_back(plan);
return;
}
if (used[i][j]) {
plan.push_back(i);
dfs(i + 1, j - v[i], plan);
plan.pop_back();
}
dfs(i + 1, j, plan);
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i++) cin >> v[i];
// 动态规划计算状态
for (int i = n; i >= 1; i--)
{
for (int j = 0; j <= m; j++)
{
f[i][j] = f[i + 1][j];
used[i][j] = 0; // 初始化为不选物品i的情况
if (j >= v[i])
{
f[i][j] = f[i + 1][j - v[i]];
used[i][j] = 1; // 标记为选物品i的情况
}
}
}
vector<int> plan;
dfs(1, m, plan);
bool is_haveplan = false;
unordered_set<string> Plans; // 用于去重,记录已经输出过的方案
// 输出所有方案
for (auto Plan : allPlans)
{
int sum = 0;
string str = "";
for (auto x : Plan)
{
sum += v[x];
str += to_string(x) + ' '; // 将物品编号拼接成字符串,方便后续去重判断
}
//输出的是s内每个物体的序号,并不是每个物体的特征值
if (sum == m && Plans.find(str) == Plans.end()) //没有找到方案且总体积等于m
{
is_haveplan = true;
for (auto x : Plan) cout << x << " ";
cout << endl;
Plans.insert(str);
}
}
if (!is_haveplan) puts("None");
return 0;
}