Codeforces Round #503 补题日记

71 篇文章 0 订阅
20 篇文章 0 订阅

A. New Building for SIS

模拟题 Wa了几发 心态容易崩 哈哈

#include <cstdio>
#include <cstring>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <sstream>
using namespace std;

long long Abs(int x){
    if(x<0) return -x;
    else return x;
}
int main(){
    long long n,h,a,b,k;
    scanf("%lld%lld%lld%lld%lld",&n,&h,&a,&b,&k);
    while(k--){
        long long k_1,k_2,k_3,k_4;
        long long ans=0;
        scanf("%lld%lld%lld%lld",&k_1,&k_2,&k_3,&k_4);
        if(k_1!=k_3) {
            if(k_2<a&&k_4<a) ans+=2*a-k_2-k_4;
            else if(k_2>b&&k_4>b) ans+=k_2+k_4-2*b;
            else ans+=Abs(k_2-k_4);
            ans+=Abs(k_1-k_3);
            printf("%lld\n",ans);
        }
        else printf("%I64d\n",Abs(k_2-k_4));
    }
    return 0;
}

B. Badge

跟着去模拟一下就好了

#include <cstdio>
#include <cstring>
#include <cstring>
#include <iostream>
#include <cmath>
#include <algorithm>
#include <map>
#include <set>
#include <queue>
#include <sstream>
using namespace std;
const int MAX_N = 1024;
int num[MAX_N];
int p[MAX_N];
int ans[MAX_N];
int main(){
    int n;
    scanf("%d",&n);
    for(int i = 1;i<=n;i++){
        scanf("%d",&p[i]);
    }
    for(int i = 1;i<=n;i++){
        memset(num,0,sizeof(num));
        num[i]++;
        int cnt = i;
        while(num[cnt]<2){
            cnt=p[cnt];
            num[cnt]++;
        }
        ans[i] = cnt;
    }
    for(int i = 1;i<=n;i++)
    i==n?printf("%d\n",ans[i]):printf("%d ",ans[i]);
    return 0;
}

C

先枚举一遍可能得到的票数 取min就好了

#include <cstdio>
#include <cstring>
#include <iostream>
#include <algorithm>
#include <cmath>
using namespace std;
//#define dbg(x) cout<<#x<<" = "<< (x)<< endl
const int MAX_N = 10024;
struct node {
   int x;
   int y;
   bool operator < (const node other) const{
   if(y==other.y) return x<other.x;
   return y < other.y;
   }
}arr[MAX_N];
int num[MAX_N];
int p[MAX_N];
int main(){
   int n,m;
   scanf("%d%d",&n,&m);
   for(int i = 1;i<=n;++i){
    scanf("%d%d",&arr[i].x,&arr[i].y);
    num[arr[i].x]++;
   }
   sort(arr+1,arr+1+n);
   int sum = 0;
   long long ans,minn = 1e18;
   for(int i=num[1];i<=n;i++){
        //dbg(i);
   ans = 0;
   sum = 0;
    for(int j = 2;j<=m;j++){
        if(num[j]>=i) {
            p[j] = num[j]-i+1;
//            dbg(p[j]);
            sum+=p[j];
        }
        else p[j] = 0;
    }
    if(sum>(i-num[1])) continue;
    sum = i-num[1]-sum;
  // dbg(sum);
    for(int k = 1;k<=n;k++){
        //dbg(sum);
        if(p[arr[k].x]){
            ans+=arr[k].y;
            //dbg(arr[k].y);
           // dbg(ans);
            p[arr[k].x]--;
            //sum--;
        }
        else if(sum&&arr[k].x!=1){
            //dbg(arr[k].y);
            ans+=arr[k].y;
            //dbg(ans);
            sum--;
        }
    }
    //dbg(ans);
    minn=min(minn,ans);
   }
   printf("%I64d\n",minn);
   return 0;
}

D The hat

交互题 题意问你给你一个圆圈的人啊 每个人都有数字卡片 问你有没有两个人卡片相同 输入一个数字 ?代表是第几个人拿这张卡片

我们可以构造函数f[x] -f[x+n/2] 发现他在1 到n/2具有连续单调性 那么就可以用二分啦

#include <cstdio>
#include <iostream>
#include <cstring>
#include <algorithm>
#include <cmath>
#include <map>
using namespace std;
int n;
const int MAX_N = 100024;
long long f[MAX_N];
void in(int x){
    printf("? %d\n",x);
    fflush(stdout);
    int m,y;
    scanf("%d",&m);
    printf("? %d\n",x+n/2);
    fflush(stdout);
    scanf("%d",&y);
    f[x] = y - m;
}
int main(){
   scanf("%d",&n);
   in(1);
   int l = 1,r = n/2;
   if(f[1]==0) {
    printf("! 1\n");
    fflush(stdout);
    return 0;
   }
   while(l<=r){
    int mid = (l+r)>>1;
    in(mid);
    if(f[mid]==0) {
        printf("! %d\n",mid);
        fflush(stdout);
        return 0;
    }
    else if(f[mid]>0){
        if(f[1]>0){
            l = mid + 1;
        }
        else r = mid - 1;
    }
    else {
        if(f[1]>0){
            r = mid - 1;
        }
        else l = mid + 1;
    }
   }
   printf("! -1\n");
   fflush(stdout);
   return 0;
}

E抽空补题吧

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值