Codeforces 883 div3 A-G

A. Rudolph and Cut the Rope

分析

直接减去所有的绳子长度小于钉子高度的的绳子

C++代码:

#include<iostream>
using namespace std;
int main(){
	int t;
	cin>>t;
	while(t--){
		int n,ans=0;
		cin>>n;
		while(n--){
			int a,b;
			cin>>a>>b;
			if(a>b)ans++;
		}
		cout<<ans<<endl;
	}
	return 0;
}

B. Rudolph and Tic-Tac-Toe

分析

模拟题,直接找每一行,每一列,每个对角线是否有三个元素相同,如果没有,则是平局

C++代码:

#include<iostream>
using namespace std;
void solve(){
	char s[4][4];
	for(int i=1;i<=3;i++)scanf("%s",s[i]+1);
	char win=' ';
	for(int i=1;i<=3;i++)//行
		if(s[i][1]==s[i][2]&&s[i][1]==s[i][3]&&s[i][1]!='.'){
			win=s[i][1];
			break;
		}
	if(win==' '){
		for(int i=1;i<=3;i++)//列
			if(s[1][i]==s[2][i]&&s[1][i]==s[3][i]&&s[1][i]!='.'){
				win=s[1][i];
				break;
			}
	}
	if(win==' '){
		if(s[1][1]==s[2][2]&&s[1][1]==s[3][3]&&s[1][1]!='.')win=s[1][1];//主对角线
		else if(s[1][3]==s[2][2]&&s[1][3]==s[3][1]&&s[2][2]!='.')win=s[2][2];//反对角线
	}
	if(win==' ')cout<<"DRAW"<<"\n";
	else cout<<win<<'\n'; 
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
} 

C. Rudolf and the Another Competition

分析

对于每个人,将他们所有题目按照从小到大的时长排序,然后直接算给定时间内可以做几题

然后记录一下第一个人的题目数及分数(即Rudolf的成绩),然后对所有人排序,找记录下来的人的编号即可

C++代码:

#include<iostream>
#include<algorithm>
using namespace std;
typedef long long LL;
typedef pair<int,LL> PII;
bool cmp(PII a,PII b){
	if(a.first!=b.first)return a.first>b.first;
	return a.second<b.second;
}
void solve(){
	int n,m,h;
	cin>>n>>m>>h;
	PII s[n+5];
	for(int i=1;i<=n;i++){
		int a[m+5];
		for(int j=1;j<=m;j++)
			cin>>a[j];
		sort(a+1,a+m+1);
		LL sum=0;
		PII t={0,0};//first表示做出来的题数,second表示罚时
		for(int i=1;i<=m;i++)
			if(sum+a[i]<=h){
				sum+=a[i];
				t.first++,t.second+=sum;
			}else break;
		s[i]=t;
	}
	PII flag=s[1];//记录Rudolf的成绩
	sort(s+1,s+n+1,cmp);
	for(int i=1;i<=n;i++)
		if(s[i].first==flag.first&&s[i].second==flag.second){
			cout<<i<<'\n';
			break;
		}
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

D. Rudolph and Christmas Tree

分析

从下往上模拟,判断每个三角形是否是完整的三角形即可,如果不是,则减去上面一部分

C++代码:

#include<iostream>
using namespace std;
void solve(){
	int n;
	double d,h;
	cin>>n>>d>>h;
	int a[n+5];
	for(int i=1;i<=n;i++)cin>>a[i];
	double ans=0;
	for(int i=1;i<n;i++){
		ans+=d*h/2;//加上完整三角形的面积
		if(a[i]+h>a[i+1]){//如果三角形上面有一部分被遮住了
			double h1=h-(a[i+1]-a[i]);//遮住的小三角形的高
			double d1=h1/h*d;//根据小三角形与大三角形相似求出小三角形的底
			ans-=h1*d1/2;//减去小三角形的面积
		}
	}
	ans+=d*h/2;//加上最第n个三角形的面积
	printf("%.7lf\n",ans);
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E1. Rudolf and Snowflakes (simple version)

分析

N<=1e6

所以直接枚举k为2~1e6时可以组成的所有的雪花大小并标记

对于每个k,最小规模的雪花大小为1+k+k*k,最大不超过N就行

依次计算即可

C++代码:

#include<iostream>
using namespace std;
typedef long long LL;
const int N=1e6+10; 
bool st[N];
void init(){
    for(LL i=2;i<=1e6;i++){//枚举所有的k
        LL now=1+i+i*i,op=i*i*i;//now为最小规模的雪花,op为变成下一规模需要的雪花数 
        while(now<N){
            st[now]=1;
            now+=op;//now增大一个规模
            op*=i;
        }
    }
}
void solve(){
    int n;
    cin>>n;
    if(st[n])cout<<"YES\n";
    else cout<<"NO\n";
}
int main(){
	init();
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

E2. Rudolf and Snowflakes (hard version)

分析

N<=1e18=(1e6)^3

分两种情况看:

1、k最大幂次为2来凑1e18

即1+k+k^2=n有大于2的正整数解,观察发现该式子为一元二次方程,所以直接用求根公式即可

2、k最大幂次大于等于3来凑1e18,可以发现(1e6)^3=1e18,所以大于2我们只需要枚举2~1e6然后根据上一题的模式来写

注意,这题会爆long long,所以用了__int128存储某些数

C++代码:

#include<iostream>
#include<map>
#include<cmath>
using namespace std;
typedef long long LL;
map<LL,LL> mp;
void init(){
	for(__int128 i=2;i<=1e6;i++){
		__int128 a=1+i+i*i,b=i*i*i;
		while(a<=1e18){
			mp[a]=1;
			a+=b;
			b*=i;
		}
	}
}
void solve(){
	LL n;
	cin>>n;
	//k^2+k+1=n
	LL delta=4*n-3,s=0;
	LL t=sqrt(delta);
	if(t*t==delta)s=(t-1)/2;//s存储大的那个解,小的不用考虑
	if(s>1)puts("YES");//有正整数解
	else if(mp[n])puts("YES");//无正整数解但是可以用其他数的更大次方表示
	else puts("NO");
}
int main(){
	init();
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
} 

F

感觉这题又臭又长,看起来很难,没补T^T

G. Rudolf and CodeVid-23

分析

数据范围很小,所以考虑状态压缩,把每个状态用对应的十进制数表示,然后把所有状态与其能到达的状态连一条边,能到达的状态也就是吃下所有药物后的状态

消除症状用数组a存储,副作用用数组b存储

假设当前状态为s,则用了第i种药物后的状态为s|b[i]&(~a[i]),|b[i]很好理解,关键是&(-a[i])这个手动模拟一下就清楚了

C++代码:

#include<bits/stdc++.h>
using namespace std;
const int N=1050;
int g[N][N];
int a[N],b[N],w[N];
int dist[N],st[N];
string start;
int n,m,sta;
void dijkstra(){
	sta=0;
	for(int i=0;i<start.size();i++)sta=sta*2+start[i]-'0';
	for(int i=0;i<=1<<n;i++)dist[i]=0x3f3f3f3f,st[i]=false;
	dist[sta]=0;
	for(int i=0;i<1<<n;i++){
		int t=-1;
		for(int j=0;j<=1<<n;j++)
			if(!st[j]&&(t==-1||dist[t]>dist[j]))
				t=j;
		st[t]=true;
		for(int j=0;j<=1<<n;j++)
			dist[j]=min(dist[j],dist[t]+g[t][j]);
	}
}
void solve(){
	cin>>n>>m>>start;
	memset(g,0x3f,sizeof g);
	for(int i=1;i<=m;i++){
		string s1,s2;
		cin>>w[i]>>s1>>s2;
		int sum1=0,sum2=0;
		for(int i=0;i<n;i++){
			sum1=sum1*2+s1[i]-'0';
			sum2=sum2*2+s2[i]-'0';
		}
		a[i]=sum1,b[i]=sum2;
	}
	for(int i=1;i<1<<n;i++)//枚举所有的状态
		for(int j=1;j<=m;j++)//服用药物j能到达的状态
			g[i][(i|b[j])&(~a[j])]=min(g[i][(i|b[j])&(~a[j])],w[j]);
	dijkstra();
	if(dist[0]==0x3f3f3f3f)cout<<-1<<'\n';
	else cout<<dist[0]<<'\n';
}
int main(){
	int t;
	cin>>t;
	while(t--){
		solve();
	}
	return 0;
}

Codeforces Round 894 (Div. 3) 是一个Codeforces举办的比赛,是第894轮的Div. 3级别比赛。它包含了一系列题目,其中包括题目E. Kolya and Movie Theatre。 根据题目描述,E. Kolya and Movie Theatre问题要求我们给定两个字符串,通过三种操作来让字符串a等于字符串b。这三种操作分别为:交换a中相同位置的字符、交换a中对称位置的字符、交换b中对称位置的字符。我们需要先进行一次预处理,替换a中的字符,然后进行上述三种操作,最终得到a等于b的结果。我们需要计算预处理操作的次数。 根据引用的讨论,当且仅当b[i]==b[n-i-1]时,如果a[i]!=a[n-i-1],需要进行一次操作;否则不需要操作。所以我们可以遍历字符串b的前半部分,判断对应位置的字符是否与后半部分对称,并统计需要进行操作的次数。 以上就是Codeforces Round 894 (Div. 3)的简要说明和题目E. Kolya and Movie Theatre的要求。<span class="em">1</span><span class="em">2</span><span class="em">3</span> #### 引用[.reference_title] - *1* *2* [Codeforces Round #498 (Div. 3) (A+B+C+D+E+F)](https://blog.csdn.net/qq_46030630/article/details/108804114)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] - *3* [Codeforces Round 894 (Div. 3)A~E题解](https://blog.csdn.net/gyeolhada/article/details/132491891)[target="_blank" data-report-click={"spm":"1018.2226.3001.9630","extra":{"utm_source":"vip_chatgpt_common_search_pc_result","utm_medium":"distribute.pc_search_result.none-task-cask-2~all~insert_cask~default-1-null.142^v93^chatsearchT3_2"}}] [.reference_item style="max-width: 50%"] [ .reference_list ]
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值