Card Game
Soda和Beta是好朋友. 今天他們準備要玩一個遊戲. Soda有n張牌, 牌面上數字分別爲a1,a2,...,an. Beta也有n張牌, 牌面上數字分別爲b1,b2,...,bn. 一開始, 他們選擇了一個小於等於n的數字m. 然後他們分別從自己的n張牌中隨機選擇了m張卡. m張卡的和大的那個人贏. Soda想要知道他是否能夠必贏, 無論選出來的m張牌是什麼.
輸入有多組數據. 第一行有一個整數T, 表示測試數據組數. 然後對於每組數據: 第一行有兩個整數 n 和 m (1≤m≤n≤500). 第2行有n個整數a1,a2,...,an (1≤ai≤1000)表示Soda的牌. 第3行有n個整數b1,b2,...,bn (1≤bi≤1000)表示Beta的牌.
對於每組數據, 如果Soda必贏輸出"YES", 否則輸出"NO".
2 3 1 4 5 6 1 2 3 5 2 3 4 7 8 9 3 4 5 2 3
YES NO
#include<iostream>
#include<vector>
#include<algorithm>
#include<cstring>
#include<queue>
using namespace std;
const int MAXN = 505;
int Soda[MAXN], Beta[MAXN];
bool cmp1(int a, int b)
{
return a < b;
}
bool cmp2(int a, int b)
{
return a > b;
}
int main()
{
int t;
cin >> t;
while (t--)
{
int n, m,sumS=0,sumB=0;
cin >> n >> m;
for (int i = 0; i < n; i++)
{
cin >> Soda[i];
}
for (int i = 0; i < n; i++)
{
cin >> Beta[i];
}
sort(Soda, Soda + n, cmp1);
sort(Beta, Beta + n,cmp2);
for (int i = 0; i < m; i++)
{
sumS += Soda[i];
sumB += Beta[i];
}
if (sumS > sumB)
{
cout << "YES" << endl;
}
else
{
cout << "NO" << endl;
}
}
return 0;
}
LCS
你有兩個序列{a1,a2,...,an}和{b1,b2,...,bn}. 他們都是1到n的一個排列. 你需要找到另一個排列{p1,p2,...,pn}, 使得序列{ap1,ap2,...,apn}和{bp1,bp2,...,bpn}的最長公共子序列的長度最大.
輸入有多組數據, 第一行有一個整數T表示測試數據的組數. 對於每組數據: 第一行包含一個整數n(1≤n≤105), 表示排列的長度. 第2行包含n個整數a1,a2,...,an. 第3行包含n個整數 b1,b2,...,bn. 數據中所有n的和不超過2×106.
對於每組數據, 輸出LCS的長度.
2 3 1 2 3 3 2 1 6 1 5 3 2 6 4 3 6 2 4 5 1
2 4
#include<iostream>
#include<cstring>
#include<stdio.h>
using namespace std;
const int MAXN = 100005;
int a[MAXN],vis[MAXN],map[MAXN];
int main()
{
int t, n;
scanf("%d", &t);
while (t--)
{
memset(vis, 0, sizeof(vis));
scanf("%d", &n);
for (int i = 0; i < n; i++)
{
scanf("%d", &a[i]);
}
for (int i = 0; i < n; i++)
{
scanf("%d", &map[a[i]]);
}
int ans = 0, p , q ;
for (int i = 1; i <= n; i++)
{
if (!vis[i])
{
int len = 0;
p = i;
q = map[i];
vis[p] = 1;
while (!vis[q])
{
p = q;
q = map[p];
vis[p] = 1;
len++;
}
if (!len)
{
ans++;
}
else
{
ans += len;
}
}
}
printf("%d\n", ans);
}
return 0;
}
</pre><pre name="code" class="cpp">