Codeforces Round 888 (Div. 3)
思路:暴力枚举
我们可以发现要让他们能相同高度首先你们之间的差值必须是k的倍数并且这个倍数必须小于m并且不能存在相同高度
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,H;
vectordel;
int a[200010],b[200010];
int prime[N];
bool st[N];
mapmp;
void solve(){
std::cin>>n>>m>>k>>H;
int res=0;
rep(i,1,n){
int x;
std::cin>>x;
int y=abs(x-H);
if(y%k==0&&y/k<=m-1&&y)res++;
}
std::cout<>t;
while(t--)solve();
}
思路:贪心排序
我们可以发现直接对奇数数值和偶数数值进行排序,然后判断是不是非递减序列即可
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,H;
vectordel;
int a[200010],b[200010],c[N];
int prime[N];
bool st[N];
mapmp;
void solve(){
std::cin>>n;
rep(i,1,n)std::cin>>a[i];
int l=0,r=0;
rep(i,1,n){
if(a[i]&1)b[l++]=a[i];
else c[r++]=a[i];
}
std::sort(b,b+l);
std::sort(c,c+r);
//rep(i,1,l)cout<a[i+1]){
f=0;
break;
}
}
if(f)std::cout<<"YES"<>t;
while(t--)solve();
}
思路:贪心
只要有k个元素和第一个元素颜色相同,并且有k个元素和最后一个元素颜色相同 ,并且选择这两种颜色的区间不相交,答案即为YES。特别的是,第一个元素和最后一个元素颜色相同,此时只需要k个颜色即可
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,H;
vectordel;
int a[200010],b[200010],c[N];
int prime[N];
bool st[N];
void solve() {
pii l,r;
int n,k;
cin>>n>>k;
for(int i=1; i<=n; i++) {
cin>>a[i];
if(a[i]==a[1]&&l.second!=k)l.first=i,l.second++;
}
for(int i=n; i>=1; i--) {
if(a[i]==a[n]&&r.second!=k)r.first=i,r.second++;
}
if(l.second!=k||r.second!=k) {
std::cout<<"NO\n";
return;
}
if(a[1]==a[n]) std::cout<<"YES\n";
else {
if(l.first>t;
while(t--)solve();
}
思路:模拟
我们可以发现,如果一个前缀和去掉一个数会存在三种情况:
① 删除第一个数
② 删除中间的数
③ 删除结尾的数
我们可以找到前缀和的差值,特别的把第一位加入进去并标记,然后记录在1~n中不存在的数的和s以及个数x,这里如果满足一下三种情况即为yes:
① 如果s>n并且在差值里面只出现一次并且x ==2
② 如果s<=n并且在差值里面只出现两次并且x ==2
③ 如果x ==1
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
const int N=2e6+10,M=2e5;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,H;
vectordel;
int a[200010],b[200010],c[N];
int prime[N];
bool st[N];
void solve(){
std::cin>>n;
rep(i,1,n-1)cin>>a[i];
mapmp;
mp[a[1]]++;
rep(i,2,n-1){
mp[a[i]-a[i-1]]++;
}
int x=0,y=0,s=0;
rep(i,1,n){
//cout<n)||(mp[s]==2&&x==2&&s<=n)||x==1)std::cout<<"YES\n";
else std::cout<<"NO\n";
}
signed main(){
std::cin>>t;
while(t--)solve();
}
思路:dfs+记忆化
典型的有向无环图的记忆化搜索,有人说dp其实都一样,我们通过记忆化搜索(dfs) 的方法来确定他每一种原料的最小花销,这样就能得到通过合成路线相加获得该药剂的最小花销。之后我们将这个价格和市场价格做比对,保留最小值即可,并记得标记已经得到的答案,已便用它来更新答案
#include
using namespace std;
#define int long long
#define rep(i,a,n) for(int i=a;i<=n;i++)
#define per(i,a,n) for(int i=n;i>=a;i--)
#define pb push_back
#define SZ(v) ((int)v.size())
#define fs first
#define sc second
#define DFX ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N=2e6+10;
typedef double db;
typedef pairpii;
int n,m,k,Q,cnt,t,H;
vectorg[N];
int w[N];
bool st[N];
void dfs(int u){
int res=0;
if(g[u].size()==0){
st[u]=1;
return ;
}
for(auto ed:g[u]){
if(!st[ed]){
dfs(ed);
res+=w[ed];
}else{
res+=w[ed];
}
}
st[u]=1;
w[u]=min(w[u],res);
}
void solve()
{
memset(st, false, sizeof st); // 一定要初始化
cin >> n >> k;
for (int i = 1; i <= n; i++) // 一定要初始化,把图清空
g[i].clear();
for (int i = 1; i <= n; i++)
cin >> w[i];
for (int i = 1; i <= k; i++)
{
int x;
cin >> x;
w[x] = 0; // 如果拥有无限的这种药水,那就价值为零
st[x] = true; // 并且标记这种药水,不用再dfs了
}
for (int i = 1; i <= n; i++)
{
int x;
cin >> x; // 读入每种药水的制作要求
for (int j = 1; j <= x; j++)
{
int v;
cin >> v;
g[i].push_back(v);
}
}
for (int i = 1; i <= n; i++)
{
if (!st[i]) // 如果没有计算过就dfs,在输出
dfs(i);
cout << w[i] << ' '; // 否则直接输出
}
cout << endl;
}
signed main(){
DFX;
std::cin>>t;
while(t--)solve();
}
#include
using namespace std;
#define pi acos(-1)
#define xx first
#define yy second
#define endl "\n"
#define int long long
#define pb push_back
typedef pair PII;
#define max(a, b) (((a) > (b)) ? (a) : (b))
#define min(a, b) (((a) < (b)) ? (a) : (b))
#define Ysanqian ios::sync_with_stdio(false), cin.tie(0), cout.tie(0);
const int N = 1e6 + 10, M = 1010, inf = 0x3f3f3f3f, mod = 998244353;
int n, k;
PII a[N];
bool cmp(PII a, PII b)
{
return a.xx < b.xx;
}
void solve()
{
int minn = 2e9;
cin >> n >> k;
for (int i = 1; i <= n; i++)
{
cin >> a[i].xx;
a[i].yy = i;
}
sort(a + 1, a + 1 + n, cmp);
int idx = 2;
for (int i = 2; i <= n; i++)
{
if (minn > (a[i].xx ^ a[i - 1].xx))
{
minn = (a[i].xx ^ a[i - 1].xx);
idx = i;
}
}
int m = ((1 << k) - 1) ^ a[idx].xx;
cout << a[idx].yy << ' ' << a[idx - 1].yy << ' ' << m << endl;
}
signed main()
{
Ysanqian;
int T;
// T = 1;
cin >> T;
while (T--)
solve();
}