题外话:我以为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,排名也没刷新个人最好排名(弱)。
比赛链接