Codeforces Round 964 (Div. 4)
知识点
1.对于两个数字,一个乘n,一个除以n,可以理解为n进制下的这个数乘10和除10。比如E题用这个知识点就可以很快的解决问题。
题解
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
string s;
cin>>s;
cout<<s[0]-'0'+s[1]-'0';
cout<<endl;
}
signed main()
{
int t=1; cin>>t;
while(t--) solve();
}
B - Card Game
1.枚举四种情况,赢的话+1,输出赢的总数即可,不要自己手推情况,会有错
#include <bits/stdc++.h>
#define int long long
using namespace std;
//-----变量----------------------
//------------------------------------------
int f(int a,int b)
{
if(a>b) return 1;
if(a==b) return 0;
if(a<b) return -1;
}
void solve()
{
int a1,a2,b1,b2;
cin>>a1>>a2>>b1>>b2;
int ans1=0;
if(f(a1,b1)+f(a2,b2)>0) ans1+=1;
if(f(a1,b2)+f(a2,b1)>0) ans1+=1;
if(f(a2,b2)+f(a1,b1)>0) ans1+=1;
if(f(a2,b1)+f(a1,b2)>0) ans1+=1;
cout<<ans1<<endl;
}
signed main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
int t=1;
cin>>t;
while(t--)
{
solve();
}
}
C. Showering
1.由于给的时间段还是从小到大排的,那么只要计算这些时间段之间的时间差值,还有0到第一个时间段的时间,还有最后一个时间段的结束时间到给定m的时间差值,取最大即可
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
int n,s,m;
cin>>n>>s>>m;
int maxx=-1;
int l,r;
int last=0;
for(int i=0;i<n;i++)
{
cin>>l>>r;
maxx=max(l-last,maxx);
last=r;
}
maxx=max(maxx,m-last);
if(maxx>=s) {
cout<<"YES";
}else cout<<"NO";
cout<<endl;
}
signed main()
{
int t=1; cin>>t;
while(t--) solve();
}
D. Slavic's Exam
1.遍历第一个字符串,遇到匹配的第二个字符串时,就把指针++,看这个指针能不能遍历完第二个字符串,遍历完检查是否还有?,如果有把?全部输出a即可,无法遍历完就是不满足题意
#include <bits/stdc++.h>
#define int long long
using namespace std;
void solve()
{
string a,b;cin>>a>>b;
int p=0;
for(int i=0;i<a.size();i++)
{
if(a[i]==b[p]||a[i]=='?'){
a[i]=b[p];
p++;
}
if(p==b.size()) {
cout<<"YES"<<endl;
break;
}
}
if(p!=b.size()){
cout<<"NO"<<endl;
return;
}
for(int i=0;i<a.size();i++){
if(a[i]=='?') cout<<'a';
else cout<<a[i];
}
cout<<endl;
}
signed main()
{
int t=1; cin>>t;
while(t--) solve();
}
E. Triple Operations
1.首先对于 \(3x\) 和\(⌊\frac{3}{y}⌋\),如果在三进制的情况下乘以3,相当于对三进制位下的数字乘以10,除以3相当于除以10,那么同时进行这两个操作时数字的三进制位下的总数是不会变的。举个例子三进制下 \(8\) 为 \(22\) ,\(11\)为\(102\),如果对8乘3,24在三进制位下为\(220\),对11除以3,3在二进制下为\(10\),那么两个数字的总位数还是5,没有变化。
2.然后当我们得到一个0以后,对于其他的数字的操作就是让它们的三进制位一直去除以10即可,这样便可以慢慢的让这些数字都转变为0。
3.那么从最小的数去得到0,对结果的贡献就是这个数的三进制位数,然后变成0时,其他的数字和当前这个数字的三进制位的总和还是不变的。答案就是,l的三进制位数+所有数字的三进制位数,那么使用前缀和,便可以快速的得到答案。
/** - swj -
*
/>_____フ
| _ _|
/`ミ _x ノ
/ |
/ ヽ ?
/ ̄| | | |
| ( ̄ヽ__ヽ_)_)
\二つ
**/
#include <bits/stdc++.h>
#define int long long
using namespace std;
typedef pair<int,int> pii;
#define all(v) v.begin(),v.end()
int dx[]={0,1,0,-1,0,0};
int dy[]={1,0,-1,0,0,0};
int dz[]={0,0,0,0,1,-1};
//-----变量----------------------
int pre[200010];//当前位置下总共的三进制位数
int a[200010];//每个数的三进制位数
//------------------------------------------
int get(int x)
{
int cnt=0;
while(x)
{
x/=3;
cnt++;
}
return cnt;
}
void solve()
{
int l,r;
cin>>l>>r;
cout<<pre[r]-pre[l-1]+a[l]<<endl;
}
signed main()
{
std::ios::sync_with_stdio(0);
std::cin.tie(0);
for(int i=1;i<200010;i++)
{
a[i]=get(i);
pre[i]=pre[i-1]+a[i];
}
int t=1;
cin>>t;
while(t--)
{
solve();
}
}
posted on 2024-08-08 15:27 swj2529411658 阅读(13) 评论(0) 编辑 收藏 举报