Codeforces Round 964 (Div. 4)

知识点

1.对于两个数字,一个乘n,一个除以n,可以理解为n进制下的这个数乘10和除10。比如E题用这个知识点就可以很快的解决问题。

题解

A. A+B Again?

#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  阅读(15)  评论(0编辑  收藏  举报

导航