暑假集训D20 2023.8.15 contest E NWERC 2021
A.Access Denied
题意:给出系统密码比对的程序和每条指令所耗费的时间,你需要通过程序返回的执行时间来破解出正确的密码.
由题目检查密码的程序.可以先猜长度再猜每个字符.长度错误会耗费
然后猜每个字符.根据判断的程序.首先判断长度花费了
然后每次 i++
花费
进入循环后,判断字符时,如果不等于则花费
每次枚举每个位置的字母即可.返回的时间
时间复杂度
#include<bits/stdc++.h>
using namespace std;
#define pb push_back
vector<char> p;
int check(string t)
{
cout<<t<<endl;
string str;
cin>>str;
cin>>str;
if(str=="GRANTED")
{
exit(0);
}
int x;
scanf(" (%d",&x);
// cout<<"x:"<<x<<endl;
cin>>str;
return (x/9) -1;
}
int main()
{
string s = "a";
int len =1;
for(int i= 'a';i<='z';i++)
p.pb(i);
for(int i= 'A';i<='Z';i++)
p.pb(i);
for(int i= '0';i<='9';i++)
p.pb(i);
// for(char j:p)
// {
// cout<<j<<endl;
// }
int x;
while(1)
{
cout<<s<<endl;
string str;
cin>>str;
// cout<<str<<' ';
cin>>str;
// cout<<str<<' ';
if(str=="GRANTED")exit(0);
scanf(" (%d",&x);
// cout<<x<<' ';
cin>>str;
// cout<<str<<'\n';
if(x!=5)break;
len++;
s+="a";
}
// cout<<len<<endl;
int i = x/9 - 1;
// cout<<i<<endl;
for(;i<len;)
{
for(char j :p)
{
// cout<<"j:"<<j<<endl;
s[i] = (char)j;
int temp = check(s);
// cout<<"temp:"<<temp<<endl;
if(temp!=i)
{
i = temp;
break;
}
}
}
return 0;
}
J.Jet Set
题意:一个人沿着环球航行,给出每个景点的经纬度,这个人从第一个点出发,依次走到最后一个点,再从最后一个点回到起点.注意每两个点之间,这个人只会走近的那一条路.问这个人能否完成环球航行?(所有的经度都被走过)
首先由于度数是
考虑差分,对于两个点的经度
另外还有一种情况,比如
时间复杂度
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5+10;
int a[N],x[N],y[N];
int m = 720;
void add(int l,int r)
{
a[l]++;
a[r+1]--;
}
int getsum(int l)
{
int res = 0;
for(int i = 0;i<=l;i++)
res+=a[i];
return res;
}
int check(int l,int r)
{
int res = 0;
for(int i = 0;i<=r;i++)
{
res+=a[i];
if(res==0&&i>=l)
{
return 0;
}
}
return 1;
}
void solve(int p,int q)
{
int a = p,b = q;
if(a>b)swap(a,b);
if(b-a>m/2)
{
add(0,a),add(b,m);
}
else if(b-a==m/2)
{
if(!check(a,b))//如果他们俩差了半个半球,并且一边没有走过,就走这边,如果这边走过了,就走另一边个半球
{
add(a,b);
}
else add(0,a),add(b,m);
}
else add(a,b);
}
signed main(int argc, char const *argv[])
{
int n;
cin>>n;
for(int i= 1;i<=n;i++)
{
cin>>x[i]>>y[i];
y[i]= y[i]*2+360;
}
y[n+1] = y[1];
for(int i= 2;i<=n+1;i++)
{
solve(y[i-1],y[i]);
}
int sum = 0;
for(int i = 0;i<=720;i++)
{
sum+=a[i];
if(sum==0)
{
cout<<"no "<<fixed<<setprecision(1)<<(double)(i-360)/2;
exit(0);
}
}
cout<<"yes";
return 0;
}
I.IXth Problem
给定一定个数的罗马字母,问能组合出来最少的罗马数字的个数是多少?(每个字母都必须用到,给出组合的方法和每种组合方法的个数.可能有多种组合方法,给出任意一种合法解即可)
考虑二分答案.那么问题转化成了给定整数
那么只需要对
首先三个三个填入每一组.如果不够了,就用该字母和下一个字母组合起来填入,比如
如果可以用完所有字母,那么就是合法解.
当数量很大时,可以通过给各组分相同的分法来加速这一过程.
时间复杂度
L.Lucky Shirt
有
如果这
如果这
因此可以按照最大位置来分.当最大位置小于
那么结果就是
时间复杂度
#include<bits/stdc++.h>
using namespace std;
double getlessp(int M,int n,int k)//calc for k circle, P(MaxPosition < M)
{
return pow((M-1)*1.0/n,k);
}
double getp(int M,int n,int k)//calc for k circle, P(MaxPosition = M)
{
return getlessp(M+1,n,k)-getlessp(M,n,k);
}
signed main()
{
double n,i,k;
cin>>n>>i>>k;
double res = 0;
for(int m = 1;m <= n;m++)
{
double exp_position;
if(m<i)
exp_position = i;
else exp_position = (m+1)/2.0;
res+=exp_position*getp(m,n,k);
}
cout<<fixed<<setprecision(10)<<res;
return 0;
}
如果您觉得阅读本文对您有帮助,请点一下“推荐”按钮,您的“推荐”将是我最大的写作动力!欢迎各位转载,但是未经作者本人同意,转载文章之后必须在文章页面明显位置给出作者和原文连接,否则保留追究法律责任的权利。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 无需6万激活码!GitHub神秘组织3小时极速复刻Manus,手把手教你使用OpenManus搭建本
· Manus爆火,是硬核还是营销?
· 终于写完轮子一部分:tcp代理 了,记录一下
· 别再用vector<bool>了!Google高级工程师:这可能是STL最大的设计失误
· 单元测试从入门到精通