CF round 962 div.3 (A~D)

3/7

A Legs

只要算出来最多多少牲口就行,先除4再看有无剩余,有剩余++就行

void solve(){
	int a;
	cin>>a;
	int ans ;
//	cout<<a<<endl;
	if(a%4==0){
		ans = a/4;
	}else{
	 	ans = a/4;
	 	ans++;
	}
	cout<<ans<<endl;	
}

B Scale

给你一个只有01的矩阵,缩小k倍,这里踩的坑是输入时是一连串数字没有空格,要用字符串转存

但解法很简单,只需i+=k,j+=k就行了

#include <iostream>
using namespace std;
int mp[1001][1001];
int main()
{
	int t;
	cin>>t;
	for(int xx = 1;xx<=t;xx++){
		int n,k;
		cin>>n>>k;
		for(int i = 1;i<=n;i++){
			string a;
			cin>>a;
			for(int j = 1,p = 0;j<=n;j++,p++){
				mp[i][j] = a[p]-'0';
			}
		}
//		for(int i = 1;i<=n;i++){
//			for(int j = 1;j<=n;j++) cout<<mp[i][j];
//			cout<<endl;
//		}
		for(int i = 1;i<=n;i+=k){
			for(int j = 1;j<=n;j+=k){
				cout<<mp[i][j];
			}
			cout<<endl;
		}
	}
	return 0;
}

C Sort

给你两个字符串a,b,每次询问给你区间l,r,问你最少多少次操作(每次操作都可以将一个字母变成另一个字母)

思路 :注意到时限是5s ,可以考虑用前缀和来存储每个位置之前的某个字母的个数

赛时踩的坑是把递推数组写进了查询里,我真shabi

int acnt[30][200001];
int bcnt[30][200001];
void solve(){
	int n,q;
	cin>>n>>q;
	string a,b;
	cin>>a>>b;
	for(int i = 1;i<=26;i++){
			for(int j = 1;j<=n;j++){
				if(a[j-1]-'a'+1==i) acnt[i][j] = acnt[i][j-1]+1;
				else acnt[i][j] = acnt[i][j-1];
			}
		}
		for(int i = 1;i<=26;i++){
			for(int j = 1;j<=n;j++){
				if(b[j-1]-'a'+1==i) bcnt[i][j] = bcnt[i][j-1]+1;
				else bcnt[i][j] = bcnt[i][j-1];
			}
		}
	while(q--){
		int l,r;
		cin>>l>>r;
		ll ans = 0;
		
		for(int i = 1;i<=26;i++){
			ans+=abs(bcnt[i][r]-bcnt[i][l-1]-acnt[i][r]+acnt[i][l-1]);
		}
		if(ans%2==0){
			ans/=2;
		}else{
			ans/=2;
			ans++;
		}
		cout<<ans<<endl;
	}
}

 D Fun

给定两个整数 n 和 x ,求 ab+ac+bc≤n 和 a+b+c≤x 的个正整数的三元组( a,b,c)的个数。
注意顺序问题(例如 ( 1,1,2 ) 和 ( 1,2,1 ) 被视为不同), a , b , c 必须严格大于 0 。

思路: 发现一定有ab<=n,又可以范围确定c的个数,因为是算总数,所以不用算出c具体是什么,

所以有代码枚举a然后枚举b,使用a*b<=n可以控在nlogn

void solve(){
    int n,k;
    cin>>n>>k;
    ll ans = 0;
    for (int i = 1; i <= n; i++)
        for (int j = 1; i * j <= n; j++) {
            ll t1 = i * j, t2 = i + j;
            if ((n - t1) / t2 > 0 && k - t2 > 0) ans += min((n - t1) / t2, k - t2);
        }
    cout<<ans<<endl;
}

  • 5
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值