拼多多超越计划笔试-2个AC 一个98% 第四题不会
有没有大佬会第四题啊 是不是动态规划
//94%-飞行棋
int main()
{
int N,K;
while(cin>>N)
{
cin>>K;
vector<int>v(K,0);
for(int i=0;i<K;i++)
cin>>v[i];
int sum=0;
int huitui=0;
bool flag=false;
for(int i=0;i<K;i++)
{
sum=sum+v[i];
if(sum==N)
{
flag=true;
break;
}
else if(sum>N)
{
sum=N-(sum-N);
huitui++;
}
else {}
}
if(flag==true)
cout<<"paradox"<<endl;
else
cout<<N-sum<<" "<<huitui<<endl;
}
} //2 100%
#include <algorithm>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <stack>
#include <unordered_map>
#include <vector>
#define fir first
#define se second
#define ll long long
#define pb push_back
#define mp make_pair
#define ull unsigned long long
#define cl(a, b) memset(a, b, sizeof(a))
#define quickio(a) ios::sync_with_stdio(a)
#define datatest() freopen("data.in", "r", stdin)
#define makeans() freopen("data.out", "w", stdout)
#define makedata() freopen("data.in", "w", stdout)
#define pii pair<int, int>
#define pll pair<ll, ll>
#define pdd pair<double, double>
using namespace std;
const int maxn = 1e6 + 10;
const int maxm = 1e6 + 10;
const int inf = 0x3f3f3f3f;
const ll mod = 1e9 + 7;
const int maxblock = sqrt(maxn) + 10;
const double eps = 1e-7;
const ll INF = 1e16;
int a[maxn][7];
int n;
int root[maxn];
int num[maxn];
int dir[6][6] = {{0, 1, 2, 3, 4, 5}, {1, 5, 2, 3, 0, 4}, {2, 1, 5, 0, 4, 3},
{3, 1, 0, 5, 4, 2}, {4, 0, 2, 3, 5, 1}, {5, 4, 2, 3, 1, 0}};
int check(int posi, int posj) {
int b[6];
for (int i = 0; i < 6; i++) b[i] = 0;
for (int i = 0; i < 6; i++) {
for (int j = 0; j < 6; j++) {
b[j] = a[posj][dir[i][j]];
}
for (int j = 0; j < 4; j++) {
int temp;
temp = b[1];
b[1] = b[2];
b[2] = b[4];
b[4] = b[3];
b[3] = temp;
int equal_flag = 1;
for (int i = 0; i < 6; i++) {
equal_flag &= (b[i] == a[posi][i]);
}
if (equal_flag) return 1;
}
}
return 0;
}
int main() {
scanf("%d", &n);
for (int i = 1; i <= n; i++) {
for (int j = 0; j < 6; j++) {
scanf("%d", &a[i][j]);
}
std::swap(a[i][1], a[i][5]);
}
int group_num = 0;
for (int i = 1; i <= n; i++) root[i] = 0;
for (int i = 1; i <= n; i++) num[i] = 0;
for (int i = 1; i <= n; i++) {
int find_flag = 0;
for (int j = i - 1; j >= 1; j--) {
if (root[j] && check(i, j)) {
num[j]++;
find_flag = 1;
break;
}
}
if (!find_flag) {
root[i] = 1;
num[i] = 1;
group_num++;
}
}
printf("%d\n", group_num);
int cnt = 0;
vector<int> res;
for (int i = 1; i <= n; i++) {
if (root[i]) {
res.push_back(num[i]);
}
}
std::sort(res.begin(), res.end());
std::reverse(res.begin(), res.end());
for (int i = 0; i < res.size(); i++) {
if (i)
printf(" %d", res[i]);
else
printf("%d", res[i]);
}
printf("\n");
return 0;
} int main() {
scanf("%d %d %d", &n, &m, &t);
for (int i = 1; i <= n; i++) {
int x, y;
scanf("%d %d", &x, &y);
v1.emplace_back(y, x);
}
for (int i = 1; i <= m; i++) {
int x, y;
scanf("%d %d", &x, &y);
v2.emplace_back(y, x);
}
std::sort(v1.begin(), v1.end());
std::sort(v2.begin(), v2.end());
int Min = 2e6;
int cur = m - 1;
int now_min = 2e6;
if (t == 0) {
printf("0\n");
return 0;
}
for (int i = 0; i < v1.size(); i++) {
int y1 = v1[i].second;
while (v1[i].first + v2[cur].first >= t && cur >= 0) {
now_min = min(now_min, v2[cur].second);
cur--;
}
Min = min(Min, y1 + now_min);
if (v1[i].first >= t) {
Min = min(Min, y1);
}
}
cur = n - 1;
now_min = 2e6;
for (int i = 0; i < v2.size(); i++) {
int y1 = v2[i].second;
while (v2[i].first + v1[cur].first >= t && cur >= 0) {
now_min = min(now_min, v1[cur].second);
cur--;
}
Min = min(Min, y1 + now_min);
if (v2[i].first >= t) {
Min = min(Min, y1);
}
}
if (Min == 2e6) Min = -1;
printf("%d\n", Min);
return 0;
}
/*
3
1 2 3 4 5 6
1 2 6 5 3 4
1 2 3 4 6 5
10
2 5 1 3 4 6
5 4 3 2 1 6
1 4 6 2 3 5
1 5 6 3 4 2
6 4 2 1 5 3
3 6 4 5 2 1
1 6 3 4 2 5
5 1 4 2 6 3
6 2 3 1 5 4
5 3 6 1 4 2
*/
查看19道真题和解析