A. Cipher Shifer
有一根绳子一一(您不知道),由小写拉丁字母组成,根据以下规则加密为字符串秒秒 :
在字符串的每个字符之后一一,添加任意数量(可能为零)的任何小写拉丁字母,与字符本身不同;
在每次添加之后,我们添加的字符都会被添加。
你得到了字符串秒秒,您需要输出初始字符串一一换句话说,您需要解密字符串秒秒 .
注意,以这种方式加密的每个字符串都会被解密独特地 .
思路:
取第一个字符存下来在依次遍历,找到和当前字符相等的字符就输出,将当前字符改为遍历到的下一个字符
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int N=1e6+7;
int a[N],b[N],s[N];
bool st[N];
int res=10,ans=0;
void solve(){
int n;
string s;
cin>>n>>s;
char c=s[0];
for(int i=1;i<n;i++){
if(c==s[i]){
cout<<c;
c=s[i+1];
i++;
}
}
cout<<endl;
}
int main(){
int t;
cin>>t;
while(t--)solve();
}
B. Binary Cafe
从前,托马发现自己在一家二元咖啡馆里。这是一个非常受欢迎和不同寻常的地方。
这家咖啡馆为客人提供各种美味的甜点。甜点的编号从0到1。这道甜点的价格是20美分,因为它是一家二元咖啡馆!托马愿意在品尝甜点上花费不超过20美元。同时,他对不止一次购买任何甜点都不感兴趣,因为一次就足以评估味道。
他可以用多少种不同的方式购买几种甜点(可能为零)品尝?
思路:这道题推一下公式就能惊奇的发现第i种甜品都会产生2^(i+1)种放案,当前托马所拥有的钱如果能到达2^i那么在1到2^i里面的方案都能被遍历到,也容易发现托马的钱不会超过2^30只需要判断甜品种类小于30,所以分2种讨论方案:
1,当甜品种类大于30时,直接输出n+1
2,当甜品种类小于30时,如果托马的值小于1到2^(m-1)的所有值的和的话,直接输出n+1,否则
输出1到2^(m-1)的所有总数和
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int N=1e6+7;
long long a[N],b[N],s[N];
bool st[N];
int res=10,ans=0;
typedef long long ll;
void linit(){
ll s=2;
a[1]=1;
for(int i=2;i<=30;i++){
a[i]=s+a[i-1];
s*=2;
}
}
void solve(){
int n,m;
cin>>n>>m;
if(m>=30){
cout<<n+1<<endl;
}
else{
ll sum=a[m];
if(n>sum){
cout<<sum+1<<endl;
}
else{
cout<<n+1<<endl;
}
}
}
int main(){
int t;
cin>>t;
linit();
while(t--)solve();
}
C. Ski Resort
Dima Vatrushin是学校的数学老师。他因工作出色而被派去休假。迪玛一直梦想着去滑雪场,所以他想抽出几天时间去滑雪。由于假期需要精心准备,他至少只去10天。
你会得到一份关于度假村天气预报的报告。也就是说,在第天,气温会下降。
迪玛出生在西伯利亚,所以只有在整个假期温度不超过10摄氏度的情况下,他才能去度假。
不幸的是,迪玛太专注于抽象代数了,以至于忘记了如何计数。他请你帮他数一下在度假胜地选择度假日期的方法。
思路:很容易发现要推一个公式,因为满足小于dv所能承受最小的温度的天数如果大于他需要连续的天数时就存在排列组合了,我们只需要从左到右遍历找连续比当前v所能承受最小的温度的个数,如果当前满足天数小dv所需要的天数就不用去了,公式:(s-k+1)*(1+(s-k+1))/2;
#include<iostream>
#include<cstring>
#include<algorithm>
#include<cmath>
#include<map>
using namespace std;
const int N=1e6+7;
long long a[N],b[N],s[N];
bool st[N];
int res=10,ans=0;
typedef long long ll;
void solve(){
int n,k,q;
cin>>n>>k>>q;
for(int i=0;i<n;i++)cin>>a[i];
int s=0;
ll sum=0;
for(int i=0;i<n;i++){
if(a[i]<=q){
s++;
}
else{
if(s>=k)sum+=(ll)(s-k+1)*(1+(s-k+1))/2;
s=0;
}
}
if(s>=k)sum+=(ll)(s-k+1)*(1+(s-k+1))/2;
cout<<sum<<endl;
}
int main(){
int t;
cin>>t;
while(t--)solve();
}
D. Wooden Toy Festival
在一个小镇上,有一个木工作坊。由于小镇很小,只有三个雕刻师在那里工作。不久,镇上计划举办一个木制玩具节。车间员工希望做好准备他们知道有n个人会来车间要求制作一个木制玩具。人们不同,可能想要不同的玩具。为了简单起见,让我们将第二个人想要的玩具的图案表示为ai(1≤ai≤109)。每个雕刻师可以预先选择一个整数图案x(1≤x≤109),不同的雕刻师可以选择不同的图案。x是整数。在节日的准备过程中,雕刻师将完美地制定出所选图案的玩具制作技术,这将使他们能够立即将其从木材中切割出来。为选择x图案的雕刻师制作y图案的玩具需要|x−y|时间,因为玩具越像他能立即制作的玩具,雕刻师处理工作的速度就越快。在节日当天,当下一个人带着制作木制玩具的请求来到车间时,雕刻师可以选择谁来承担这项工作。同时,雕刻师都是非常熟练的人,可以同时为不同的人完成订单。由于人们不喜欢等待,雕刻师希望选择图案进行准备,使所有人的最大等待时间尽可能短。
思路:这道题我们可以二分答案,找到最小的等待时间进行遍历查找,是否有满足大于当前二分答案的两倍的个数大于3,如果有就在大于当前二分的值的区间,否则就左边找
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int t,n;
ll a[200010];
bool check(ll k)
{
int num=0;
ll x=a[1];
for(int i=1;i<=n;i++)
if(abs(a[i]-x)>k*2) x=a[i],num++;
if(num>=3) return false;
return true;
}
int main()
{
cin>>t;
while(t--)
{
cin>>n;
for(int i=1;i<=n;i++) cin>>a[i];
sort(a+1,a+n+1);
ll l=0,r=a[n];
while(l<=r)
{
ll mid=l+(r-l)/2;
if(check(mid)) r=mid-1;
else l=mid+1;
}
cout<<l<<endl;
}
}
E. Character Blocking
思路:
只能说分类讨论...,用个cnt记录有多少个下标是不同的
然后模拟即可,情况2要分情况讨论
#include <iostream>
#include <cstring>
#include <algorithm>
#include <vector>
#include <map>
#include<functional>
#define ll long long
using namespace std;
const int N=2e5+10;
#define ll long long
typedef pair<int, int> PII;
int n,m,k;
void solve()
{
string a,b;
cin>>a>>b;
a="?"+a;
b="?"+b;
int t;
cin>>t>>m;
map<int,vector<int>> mp;
int cnt=0;
for(int i=1;i<a.size();i++) cnt+=a[i]!=b[i];
for(int i=1;i<=m;i++)
{
for(auto&x:mp[i])
{
if(a[x]!=b[x]) cnt++;
}
int op;cin>>op;
if(op==1)
{
int x;cin>>x;
cnt-=(a[x]!=b[x]);
mp[i+t].push_back(x);
}
else if(op==2){
int x1,y1,x2,y2;
cin>>x1>>y1>>x2>>y2;
if(x1==1&&x2==1)
{
if(a[y1]!=b[y1]) cnt--;
if(a[y2]!=b[y2]) cnt--;
swap(a[y1],a[y2]);
if(a[y1]!=b[y1]) cnt++;
if(a[y2]!=b[y2]) cnt++;
}
else if(x1==1&&x2==2)
{
if(a[y1]!=b[y1]) cnt--;
if(a[y2]!=b[y2]) cnt--;
swap(a[y1],b[y2]);
if(a[y1]!=b[y1]) cnt++;
if(a[y2]!=b[y2]) cnt++;
}
else if(x1==2&&x2==1){
if(b[y1]!=a[y1]) cnt--;
if(b[y2]!=a[y2]) cnt--;
swap(b[y1],a[y2]);
if(b[y1]!=a[y1]) cnt++;
if(b[y2]!=a[y2]) cnt++;
}
else if(x1==2&&x2==2)
{
if(b[y1]!=a[y1]) cnt--;
if(b[y2]!=a[y2]) cnt--;
swap(b[y1],b[y2]);
if(b[y1]!=a[y1]) cnt++;
if(b[y2]!=a[y2]) cnt++;
}
}
else {
if(cnt)cout<<"NO\n";
else cout<<"YES\n";
}
}
}
int main()
{
cin.tie(0);cout.tie(0);ios::sync_with_stdio(0);
int t;
cin>>t;
while(t--) solve();
}