0
点赞
收藏
分享

微信扫一扫

upc 2021秋组队训练赛第三场 2020 Rocky Mountain Regional Contest


水题收割机(不是

A.Stopwatch

题意:
有一个计时器,初始状态为暂停。只有一个按钮,按下可以开始或暂停计时。给出长度为的序列表示在时刻为的时候按下计时器。问执行完个操作后计时器显示的情况。

思路:
如果为奇数,说明此时正在计时。
否则,计时器的时间为偶数项减去奇数项的和。
代码:

ll a[1100];

int main()
{
int n=read;
for(int i=1;i<=n;i++) a[i]=read;
if(n%2) puts("still running");
else{
ll ans=0;
for(int i=2;i<=n;i+=2) ans+=a[i]-a[i-1];
cout<<ans;
}
return 0;
}

B.Arithmetic Decoding

思路:
很小,考虑直接状压枚举或出所有的情况,判断计算出的数是否和给定的数相等。
大概考点就是如何把二进制的小数转化为十进制的小数吧,​​​参考​​ 代码:

double cul(string str,int j,int len){
int k=j+1;
int cetz=0,cetx=-1;
long Sumz=0;
double Sumx=0;
for( ;j>0;j--)
{
Sumz+=(str[j-1]-'0')*pow(2,cetz);
cetz++;
}
for( ;k<len;k++)
{
Sumx+=(str[k]-'0')*pow(2,cetx);
cetx--;
}
return Sumz+Sumx;
}

int main(){
int n=read,d=read;
string s;cin>>s;
int len=s.size(),j;
for(j=0;j<len;j++)
if(s[j]=='.') break;
double x=cul(s,j,len);
double pa=d*1.0/8,pb=1.0-pa;

for(int i=0;i<(1<<n);i++){
double a=0,b=1;
string res;
for(int j=0;j<n;j++){
double c=a+pa*(b-a);
if(i&(1<<j)) b=c,res+="A";
else a=c,res+="B";
}
if(a==x){
cout<<res<<endl;
return 0;
}
}
return 0;
}

D.Forced Choice

思路:
每次判断猜测的数是否在给出的数里,在的话输出,否则输出
代码:

int main()
{
int n=read,p=read,m=read;
rep(i,1,m){
bool flag=0;
int k=read;
rep(j,1,k){
int x=read;
if(x==p) flag=1;
}
if(flag) puts("KEEP");
else puts("REMOVE");
}
return 0;
}

F.Conquest

题意:
给出一个图,每个点有点权。从开始扩张,如果当前扩张到的点的邻接点的值小于当前的总权值和,则可以扩张过去。问能够得到的最大权值。
思路:
优先队列瞎搞的,将每个点的邻接点按照点权从小到大排序,对于不能扩张到的点先存在优先队列里。
感觉写的假的一批,最开始样例没过都
代码:

const int maxn=2e5+100;

int n,m,a[maxn];
vector<int>g[maxn];
bool vis[maxn];

priority_queue <PII,vector<PII>,greater<PII> > q;

bool cmp(int x,int y){
return a[x]<a[y];
}

ll bfs(){
ll ans=a[1];
q.push({a[1],1});
vis[1]=1;
while(!q.empty()){
PII u=q.top();q.pop();
int w=u.first,ne=u.second;
//cout<<w<<" "<<ne<<endl;
if(!vis[ne]&&ans<=w) break;
else if(!vis[ne]) ans+=w;
for(auto t:g[ne]){
if(vis[t]) continue;
if(!vis[t]&&ans>a[t]){
vis[t]=1;ans+=a[t];
}
q.push({a[t],t});
}
}
return ans;
}

int main() {

n=read,m=read;
rep(i,1,m){
int u=read,v=read;
g[u].push_back(v);
g[v].push_back(u);
}
rep(i,1,n) a[i]=read;
rep(i,1,n) sort(g[i].begin(),g[i].end(),cmp);

printf("%lld\n",bfs());
return 0;
}

G.Distance

题意:
给出个点,求曼哈顿距离之和
思路:
经典题了,考虑每个点的坐标对答案的贡献,坐标对答案的贡献。
比如坐标,从小到大排序后,的贡献为(这个点之前的点),的贡献为(这个点之后的点)
代码:

const int maxn=2e5+100,inf=0x3f3f3f3f;
const double eps=1e-5;

ll x[maxn],y[maxn];

int main()
{
int n=read;
rep(i,1,n) x[i]=read,y[i]=read;
sort(x+1,x+1+n);
sort(y+1,y+1+n);
ll ans=0;
rep(i,1,n){
// cout<<x[i]<<"****"<<y[i]<<endl;
ans=ans-x[i]*(n-i)+x[i]*(i-1);
//cout<<ans<<" ";
ans=ans-y[i]*(n-i)+y[i]*(i-1);
//cout<<ans<<endl;
}
write(ans);
return 0;
}

I.Vaccine Efficacy

思路:
模拟,好像没有啥细节。
代码:

int sumy,sumn;
int y[4],n[4];

int main()
{
int m=read;
rep(i,1,m){
string s;cin>>s;
if(s[0]=='Y'){
sumy++;
for(int j=1;j<=3;j++){
if(s[j]=='Y') y[j]++;
}
}
else{
sumn++;
for(int j=1;j<=3;j++){
if(s[j]=='Y') n[j]++;
}
}
}
for(int i=1;i<=3;i++){
double ty=y[i]*1.0/sumy;
double tn=n[i]*1.0/sumn;
if(ty>=tn) puts("Not Effective");
else printf("%.6f\n",100*(1-ty/tn));
}
return 0;
}

K Train Boarding

思路:
反正,跑个的不过分吧
代码:

int pos[110],cnt[110];

int main(){
int n=read,l=read,p=read;
for(int i=1;i<=n;i++) pos[i]=(2*i-1)*l/2;//,cout<<pos[i]<<endl;
int res=0,tmp=0;
rep(i,1,p){
int x=read;
int minn=inf,t=-1;
for(int j=1;j<=n;j++){
int now=abs(pos[j]-x);
if(minn>now) minn=now,t=j;
else if(minn==now) t=max(t,j);
}
cnt[t]++;
tmp=max(tmp,cnt[t]);
res=max(res,minn);
}
cout<<res<<endl;
cout<<tmp<<endl;
return 0;
}


举报

相关推荐

0 条评论