Card Game
Time Limit: 2000/1000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
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
Time Limit: 6000/3000 MS (Java/Others)
Memory Limit: 65536/65536 K (Java/Others)
问题描述
你有两个序列{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
一开始以为真的是LCS,一直暴力找序列,发现肯定会TLE,只要固定一个找这个数字在另一个序列中出现的位置,然后再将数字固定为该
的位置的本序列的数,重复操作即可。相当于找环。
主要注意2个位置相同的情况,即子环,用cin会超3000MS,但是用scanf只需用1100+MS.
#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">