CF1974題解

daydreamer_zcxnb發表於2024-11-11

閒話

1974年第一次在東南亞打自由搏擊就取得了冠軍······

CF1974A

簡單計數題

點選檢視程式碼
#include<bits/stdc++.h>
#define int long long
using namespace std;
int t;
signed main(){
	scanf("%lld",&t);
	while(t--){
		int x,y,ans=0,num=0;
		scanf("%lld%lld",&x,&y);
		ans+=y/2;
		if(y&1)  num+=4,ans++;
		num+=ans*7;
		if(x>num){
			ans+=(int)ceil((double)(x-num)/15.0);
		}
		printf("%lld\n",ans);
	}
}

CF1974B

洛谷題面翻譯有誤,建議自己看CF做題
照題面模擬即可,簡單題

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int t,n;
int a[N],d[N];
char s[N];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		scanf("%s",s+1);
		for(int i=1;i<=n;i++){
			a[i]=s[i]-'a'+1;
		}
		sort(a+1,a+1+n);
		int len=unique(a+1,a+1+n)-a-1;
		for(int i=1;i<=len;i++){
			int j=len-i+1;
			d[a[i]]=a[j];
		}
		for(int i=1;i<=n;i++){
			printf("%c",d[s[i]-'a'+1]+'a'-1);
		}
		printf("\n");
	}
}

CF1974C

注意仔細審題,讓你求的時美麗的三元組對數

非常巧妙的一道題,使我的大腦停止運轉

首先我們考慮如果要成為一個美麗三元組對,就要滿足在這個三元對上有兩個對應位置上元素相同所以我們設兩個三元組為 \(\{a,b,c\}\)\(\{d,e,f\}\) 我們分別記錄下 \(\{a,b\}==\{d,e\},\{a,c\}==\{d,f\},\{b,c\}==\{e,f\}\) 的個數設為 \(x,y,z\)

但是考慮到有可能有 \(\{a,b,c\}==\{d,e,f\}\) 的情況,所以我們在設一個 \(k\) 為這種情況的個數,因為這種情況會被前面連續統計三遍,所以最終答案即為 \(x+y+z-3*k\)

點選檢視程式碼
#include<bits/stdc++.h>
#define pii pair<int,int>
#define int long long
using namespace std;
const int N=2e5+5;
int t,n;
int a[N];
map<pii,int>f,s,e;
map<pair<int,pii>,int>c;
signed main(){
	scanf("%lld",&t);
	while(t--){
		scanf("%lld",&n);
		for(int i=1;i<=n;i++){
			scanf("%lld",&a[i]);
		}
		f.clear();
		s.clear();
		e.clear();
		c.clear();
		int ans=0;
		for(int i=3;i<=n;i++){
			ans+=f[{a[i-2],a[i-1]}];
			f[{a[i-2],a[i-1]}]++;
			ans+=s[{a[i-1],a[i]}];
			s[{a[i-1],a[i]}]++;
			ans+=e[{a[i-2],a[i]}];
			e[{a[i-2],a[i]}]++;
			ans-=c[{a[i-2],{a[i-1],a[i]}}]*3;
			c[{a[i-2],{a[i-1],a[i]}}]++;
		}
		printf("%lld\n",ans);
	}
}

CF1974D

一道水題

sb題面翻譯漏掉了一條重要資訊導致我卡了好久

兩個物體均要進行移動,不能只有一個物體動,例如樣例中第4個SN的情況就不行。

珍愛生命,別看翻譯

然後就手模一下就知道,我們把 NS,EW 捆綁在一起,分給同一個機器人,剩下的多的就平分給兩個機器人,若剩下的是奇數無法平分就NO

還有要特判只有一個機器人動的情況,再把它捆綁的步數,就是一組NS或EW分給另一個機器人就可以了

程式碼實現有點複雜,我寫了100行

點選檢視程式碼
#include<bits/stdc++.h>
using namespace std;
const int N=2e5+5;
int t,n;
int a[N],pr[N],ph[N];
char s[N];
int main(){
	scanf("%d",&t);
	while(t--){
		scanf("%d",&n);
		scanf("%s",s+1);
		int u=0,d=0,l=0,r=0;
		for(int i=1;i<=n;i++){
			if(s[i]=='N')  a[i]=1,u++;
			if(s[i]=='S')  a[i]=2,d++;
			if(s[i]=='E')  a[i]=3,l++;
			if(s[i]=='W')  a[i]=4,r++;
		}
		if(l>=r){
			int num=l-r;
			if(num&1){
				printf("NO\n");
				continue;
			}
			pr[3]=num/2+r;
			ph[3]=num/2;
			pr[4]=r;
			if(num==0&&r>1){
				pr[3]--;pr[4]--;
				ph[3]++;ph[4]++;
			}
		}
		else{
			int num=r-l;
			if(num&1){
				printf("NO\n");
				continue;
			}
			pr[4]=num/2+l;
			ph[4]=num/2;
			pr[3]=l;
			if(num==0&&l>1){
				pr[4]--;pr[3]--;
				ph[4]++;ph[3]++;
			}
		}
		if(u>=d){
			int num=u-d;
			if(num&1){
				printf("NO\n");
				continue;
			}
			ph[1]=num/2+d;
			pr[1]=num/2;
			ph[2]=d;
			if(num==0&&d>1){
				ph[1]--;ph[2]--;
				pr[1]++;pr[2]++;
			}
		}
		else{
			int num=d-u;
			if(num&1){
				printf("NO\n");
				continue;
			}
			ph[2]=num/2+u;
			pr[2]=num/2;
			ph[1]=u;
			if(num==0&&u>1){
				ph[1]--;ph[2]--;
				pr[1]++;pr[2]++;
			}
		}
		if(!pr[1]&&!pr[2]&&!pr[3]&&!pr[4]){
			printf("NO\n");
			continue;
		}
		if(!ph[1]&&!ph[2]&&!ph[3]&&!ph[4]){
			printf("NO\n");
			continue;
		}
		for(int i=1;i<=n;i++){
			if(pr[a[i]]){
				printf("R");
				pr[a[i]]--;
			}
			else{
				printf("H");
				ph[a[i]]--;
			}
		}
		printf("\n");
	}
}