T1隔离
题目传送门:隔离http://bbcoj.cn/contest/1027/problem/1
实在是太刁钻了,有两种情况没有考虑:
1.隔离后做完全部的是再回去
2.在路程上花的时间如果大于在隔离一次花的时间,那还不如隔离,然后做完全部的事
100分只有60分,damn
#include<bits/stdc++.h>
using namespace std;
int a[1005];
int n,ans;
bool flag=0;
int main(){
freopen("isolate.in","r",stdin);
freopen("isolate.out","w",stdout);
cin>>n;
for(int i=1;i<=n;i++){
cin>>a[i];
if(a[i]>=240) flag=1;
ans+=a[i];
}
if(flag){
cout<<ans+10480<<endl;
return 0;
}//原因一
int cnt=1,tmp=0;
for(int i=1;i<=n;i++){
if(tmp+a[i]>=240) cnt++,tmp=0;
tmp+=a[i];
}
cout<<min(cnt*400,10480)+ans;//原因二
return 0;
}
T2和积
题目传送门:和积http://bbcoj.cn/contest/1027/problem/2
用的暴力枚举,但是没有记忆化,导致超时了,优化写的有误,最后只拿了50分
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma Gcc optinize("o1")
#pragma Gcc optinize("o2")
#pragma Gcc optinize("o3")
#pragma GCC optimize("Ofast")
using namespace std;
const int N=5e6+5;
int s[N],j[N];//记忆化
inline int read() {
int x=0,f=1;
char c=getchar();
while(c<'0'||c>'9') {
if(c=='-') f=-1;
c=getchar();
}
while(c>='0'&&c<='9') {
x=x*10+c-'0';
c=getchar();
}
return x*f;
}
inline void add(int x) {
int y=x;
int sum=0,tmp=1;
while(x) {
sum+=x%10;
tmp*=x%10;
x/=10;
}
s[y]=sum;//记忆化
j[y]=tmp;//记忆化
return ;
}
int main() {
freopen("sump.in","r",stdin);
freopen("sump.out","w",stdout);
int T;
T=read();
while(T--) {
int m,n,k;
m=read();
n=read();
k=read();
int x=-2e9,ans=0;
for(int i=m; i<=n; i++) {
int sum,tmp;
if(s[i]==0)add(i);//记忆化
sum=s[i];
tmp=j[i];
if(sum==k&&tmp>x){
x=tmp;
ans=i;
}
}
printf("%d %d\n",ans,x);
}
return 0;
}
T3 电梯停靠
题目传送门:电梯停靠http://bbcoj.cn/contest/1027/problem/3
其实可以用数学方法:
类似于在的最小值
#include<bits/stdc++.h>
#pragma GCC optimize(1)
#pragma GCC optimize(2)
#pragma GCC optimize(3)
#pragma Gcc optinize("o1")
#pragma Gcc optinize("o2")
#pragma Gcc optinize("o3")
#pragma GCC optimize("Ofast")
using namespace std;
#define int long long
const int N=5e6+6;
int ans,x,num;
int a[N];
inline int read(){
int s=0;
char ch=getchar();
while(ch>'9'||ch<'0') ch=getchar();
while(ch<='9'&&ch>='0'){
s=(s<<3)+(s<<1)+ch-'0';
ch=getchar();
}
return s;
}
signed main(){
freopen("lift.in","r",stdin);
freopen("lift.out","w",stdout);
int n,m;
n=read();
m=read();
for(int i=1;i<=m;i++){
int p,q;
p=read();
q=read();
ans+=abs(p-q);
a[++num]=p;
a[++num]=q;
}
sort(a+1,a+num+1);
x=a[(num+1)/2];
for(int i=1;i<=num;i++) ans+=abs(x-a[i]);
cout<<x<<' '<<ans<<endl;
return 0;
}
T4分组选数
分组选数http://bbcoj.cn/contest/1027/problem/4
还没做出来,有大佬帮个忙,谢谢