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

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

水题收割机(不是

A.Stopwatch

题意:

有一个计时器,初始状态为暂停。只有一个按钮,按下可以开始或暂停计时。给出长度为n的序列a i

表示在时刻为a i的时候按下计时器。问执行完n个操作后计时器显示的情况。


思路:

如果n为奇数,说明此时正在计时。

否则,计时器的时间为偶数项减去奇数项的和。

代码:

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

思路:

n很小,考虑直接状压枚举或d f s出所有的情况,判断计算出的数是否和给定的数相等。

大概考点就是如何把二进制的小数转化为十进制的小数吧,参考

代码:

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

思路:

每次判断猜测的数是否在给出的数里,在的话输出K E E P,否则输出R E M O V E

代码:

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

题意:

给出一个图,每个点有点权。从1开始扩张,如果当前扩张到的点的邻接点的值小于当前的总权值和,则可以扩张过去。问能够得到的最大权值。

思路:

优先队列瞎搞的,将每个点的邻接点按照点权从小到大排序,对于不能扩张到的点先存在优先队列里。

感觉写的假的一批,最开始样例1没过都96。

代码:

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

题意:

给出n个点,求曼哈顿距离之和

思路:

经典题了,考虑每个点的x坐标对答案的贡献,y坐标对答案的贡献。

比如x坐标,从小到大排序后,+ x的贡献为x ∗ ( i − 1 )(这个点之前的点),− x的贡献为− x ∗ ( n − i )(这个点之后的点)

代码:

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

思路:

反正n才100,跑个n 2的不过分吧

代码:

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;
}




目录
相关文章
2022天梯赛三月冲刺——PAT (Advanced Level)1013 Battle Over Cities (并查集找连通块)
2022天梯赛三月冲刺——PAT (Advanced Level)1013 Battle Over Cities (并查集找连通块)
103 0
upc2021秋组队训练赛第一场 ICPC North Central NA Contest 2020
upc2021秋组队训练赛第一场 ICPC North Central NA Contest 2020
89 0
upc2021秋组队训练赛第一场 ICPC North Central NA Contest 2020
UPC组队赛第三场——G: The Famous ICPC Team Again (主席树)
UPC组队赛第三场——G: The Famous ICPC Team Again (主席树)
98 0
2020ICPC昆明M.Stone Games(主席树)
2020ICPC昆明M.Stone Games(主席树)
79 0
|
人工智能 算法
[UPC] 山东省第九届省赛 Games | dp
题意: 有n堆石子,后手可以在游戏开始之前挪走不超过d堆,然后问后手赢得游戏的方案数量 % 1e9 + 7 思路: 先求出所有数的亦或和 设d p [ i ] [ j ] [ k ] dp[i][j][k]dp[i][j][k]为前 i ii 堆石子挪走 j jj 堆,并且亦或和为 k kk 的方案数 然后进行dp
120 0
Mad Scientist (纯模拟题)
Mad Scientist 题目描述 Farmer John’s cousin Ben happens to be a mad scientist. Normally, this creates a good bit of friction at family gatherings, but it can occasionally be helpful, especially when Farmer John finds himself facing unique and unusual problems with his cows.
137 0
|
人工智能 Java BI
HDU - 2018杭电ACM集训队单人排位赛 - 2 - Problem D. Team Name
HDU - 2018杭电ACM集训队单人排位赛 - 2 - Problem D. Team Name
128 0
|
人工智能 Java
HDU - 2018杭电ACM集训队单人排位赛 - 2 - Problem C. Team Match
HDU - 2018杭电ACM集训队单人排位赛 - 2 - Problem C. Team Match
143 0
|
Java
HDU - 2018杭电ACM集训队单人排位赛 - 3 - Problem F. Four-tuples
HDU - 2018杭电ACM集训队单人排位赛 - 3 - Problem F. Four-tuples
140 0