Codeforces Round 1075 (Div. 2)复盘 A-C2
A 模拟 略
B 贪心
https://codeforces.com/contest/2189/problem/B
思路:先把不需要回滚的跳了 再去选择一个最优的一直跳 记录对应的回滚次数
点击查看代码
void solution::solve()
{
int n,x;cin>>n>>x;
vii a(n,vi(3));
int sum=0;
for(int i=0;i<n;i++) cin>>a[i][0]>>a[i][1]>>a[i][2];
vi s(n,0);
for(int i=0;i<n;i++)
{
sum+=a[i][0]*(a[i][1]-1);
s[i]=a[i][1]*a[i][0]-a[i][2];
//记录每个跳跃回滚一次时可以前进的距离
}
sort(s.rbegin(),s.rend());
if(sum<x&&s[0]<=0) return cout<<-1<<endl,void();
//如果没到达 而且无法继续前进 输出-1
else if(sum>=x) return cout<<0<<endl,void();
int res=x-sum;
int cnt=res/s[0]+(res%s[0]?1:0);
cout<<cnt<<endl;
}
C1 构造
思路:n分奇偶 具体看代码吧()TT
其实主要思路就是 固定一个a[i]^i的值 固定在最后
因为放在最后的数字没有任何限制
点击查看代码
void solution::solve()
{
int n;cin>>n;
if(n%2)
{
cout<<n-1<<' ';
for(int i=2;i<=n-1;i++)
{
cout<<(i^1)<<' ';
}
cout<<1<<endl;
}
else
{
int f=n;
if(f^(n-1)>=n) f=1;
//当n或n-1==2^x时 n^(n-1)>n
cout<<n+1-f<<' ';
for(int i=2;i<=n-1;i++) cout<<(f^i)<<' ';
cout<<f<<endl;
}
}
C2 构造
思路:比c1多了一个a[1] 考虑到奇数的情况其实是符合的 主要是偶数的情况
n=2^x时必然不存在对应的构造 假定与c1的构造相同 这种情况下 f=1
但是i=1时的a[1]^1=n+1 可以知道必然不存在这种情况
那么 如何在n为偶数的其他情况下构造出呢
swap(a[r],a[1]) -> r=n-(1<<x) -> x=lg(n)
因为令a[r]=n时 可以使得n ^ r=2 ^ x (<n) 且必然大于r
这是因为构造的方案是令a[i]^i=1 所以其实是构造出类似3254 这种n+1->n (n为偶数)
点击查看代码
void solution::solve()
{
int n;cin>>n;
if(n==(1<<(__lg(n)))) return cout<<-1<<endl,void();
else if((n)%2)
{
cout<<n-1<<' ';
for(int i=2;i<=n-1;i++)
{
cout<<(i^1)<<' ';
}
cout<<1<<endl;
}
else
{
vi a={n};
for(int i=2;i<=n-1;i++) a.push_back(i^1);
a.push_back(1);
int x=n-(1<<(__lg(n)));
swap(a[x-1],a[0]);
for(auto &ans:a) cout<<ans<<' ';
cout<<endl;
}
}
总结:还是出太慢了 但是这个b的题意确实非常模糊(肯定)

浙公网安备 33010602011771号