首页 > 其他分享 >挖土机杯 CSP-J 组模拟赛 R2 记录

挖土机杯 CSP-J 组模拟赛 R2 记录

时间:2022-10-16 13:33:44浏览次数:72  
标签:ch last 赛时 R2 ll namespace long 挖土机 CSP

题外话:我以为10:00开始的......没有足够时间搞,不过题目总体而言难度不大,虽然但是也没赛时AC两题。

T1

比较简单的送分题,就是分数的加减及约分而已,最后来个特判0和整除。至于正负的判断我是放在过程中的,但是一开始打代码的时候一些问题没注意,调了好久。

#include <bits/stdc++.h>
#define ll long long
using namespace std;
namespace IO{
	char ibuf[(1<<20)+1],*iS,*iT;
	#if ONLINE_JUDGE
	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
 	#else
	#define gh() getchar()
	#endif
	#define reg register
	inline long long read(){
		reg char ch=gh();
		reg long long x=0;
		reg char t=0;
		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
		return t?-x:x;
	}
}
using IO::read;
const int N=800, INF=0x3f3f3f3f;
int n;
int a,b,op;
int ans1,ans2;
void add(int a,int b){
	int m=ans2*b/__gcd(b,ans2);
	ans1=ans1*(m/ans2);
	a=a*(m/b);
	ans2=m;
	ans1=ans1+a;
	int k=__gcd(ans1,ans2);
	ans1/=k;
	ans2/=k;
	if(ans2<0){
		ans1*=-1;
		ans2/=-1;
	}
}
void jian(int a,int b){
	int m=ans2*b/__gcd(b,ans2);
	ans1=ans1*(m/ans2);
	a=a*(m/b);
	ans2=m;
	ans1=ans1-a;
	int k=__gcd(ans1,ans2);
	ans1/=k;
	ans2/=k;
	if(ans2<0){
		ans1*=-1;
		ans2/=-1;
	}
}
int main(){
	n=read();
	a=read();b=read();op=read();
	if(op==1)ans1=a,ans2=b;
	else ans1=a*(-1),ans2=b;
	for(int i=2;i<=n;i++){
		a=read();b=read();op=read();
		if(op==1)add(a,b);
		else jian(a,b);
	}
	if(ans1==0)cout<<0<<endl;
	else if(ans1%ans2==0)cout<<ans1/ans2<<endl;
	else cout<<ans1<<'/'<<ans2<<endl;
	return 0;
}
/*
今天你AC了几题?
不要颓废!!!!
Dalao has AKed IOI several times!!!
*/

时间:10:33-11:11

T2

也是一个明显的模拟题,但是\(O(n^2)\),优化的话也很好想,首先看式子可知要找到\(p_{max}\)需要找到\(r\)的最小值的最大值,不过赛时就想到了这,时间紧迫也没想怎么找了,写了一个贪心,拿了40pts。

T3

这个就是一个贪心,只要考虑到当天的陨石尽可能当天或第二天全部干掉,毕竟每天都有一定的消耗值,如果第二天又来了一些陨石,可以将先将原先的解决(毕竟不解决那些肯定就不是最优解了),然后如果还有余力,就顺便把当天新来的陨石干掉一些,以此类推下去。(赛时未A,只拿了20pts的随缘分)

#include <bits/stdc++.h>
#define ll long long
using namespace std;
namespace IO{
	char ibuf[(1<<20)+1],*iS,*iT;
	#if ONLINE_JUDGE
	#define gh() (iS==iT?iT=(iS=ibuf)+fread(ibuf,1,(1<<20)+1,stdin),(iS==iT?EOF:*iS++):*iS++)
 	#else
	#define gh() getchar()
	#endif
	#define reg register
	inline long long read(){
		reg char ch=gh();
		reg long long x=0;
		reg char t=0;
		while(ch<'0'||ch>'9')   t|=ch=='-',ch=gh();
		while(ch>='0'&&ch<='9') x=x*10+(ch^48),ch=gh();
		return t?-x:x;
	}
}
using IO::read;
const int N=300000+10, INF=0x3f3f3f3f;
int n,k;
int d[N],m[N],f[N];
int ans;
int main(){
	n=read();k=read();
	int last=0;
	int maxdate=0;
	for(int i=1;i<=n;i++){
		d[i]=read();m[i]=read();
		f[d[i]]+=m[i];
		maxdate=max(maxdate,d[i]);
	}
	for(int i=1;i<=maxdate+1;i++){
		if(last>k){
			ans+=k;
			last=f[i];
		}else{
			last+=f[i];
			if(last<k)ans+=last,last=0;
			else ans+=k,last-=k;
		}
	}
	cout<<ans<<endl;
	return 0;
}
/*
今天你AC了几题?
不要颓废!!!!
Dalao has AKed IOI several times!!!
*/

T4

没看懂。感觉是使序列中的数两两一组或者单独一组,且和全部相同的不同种数,然后再求对于高度最大值,有多少不同的分组满足要求......(蒟蒻の理解)。想骗分,没骗到。/ll

赛时分数:100+40+20+0=160,排名也没刷新个人最好排名(弱)。
比赛链接

标签:ch,last,赛时,R2,ll,namespace,long,挖土机,CSP
From: https://www.cnblogs.com/FaceLuck/p/16796069.html

相关文章