首页 > 其他 > 详细

2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest

时间:2019-02-27 19:55:37      阅读:264      评论:0      收藏:0      [点我收藏+]

题目传送门

题号 A B C D E F G H I J K
状态 Ο Ο Ο . . . . . Ο . .

 

Ο:当场

Ø:已补

.  :  待补

  

Secret of Chocolate Poles

简单dp

Thinking&Code:kk

技术分享图片
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
#define fpn() freopen("simple.in","r",stdin)
#define rd read()
using namespace std;
typedef long long ll;
const int maxn=110;
ll dp[maxn][2],l,k;
int main(){
    while(cin>>l>>k)
    {
        clr(dp,0);
        dp[0][0]=1;
        for(int i=1;i<=l;i++)
        {
            dp[i][0]+=dp[i-1][1];
            dp[i][1]+=dp[i-1][0];
            if(i-k>=0){
                dp[i][1]+=dp[i-k][0];
            }
        }
        ll ans=0;
        for(int i=1;i<=l;i++)
        {
            ans+=dp[i][1];
        }
        printf("%lld\n",ans);
    }
}
View Code

 


Parallel Lines
Thinking:pai爷

Code:zz

搜索

技术分享图片
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
#define fpn() freopen("simple.in","r",stdin)
#define rd read()
using namespace std;
typedef long long ll;
const int maxn=110;
int m;
struct node{
    int x,y;
}z[110];
pair<int,int>pa;
map<pair<int,int>, int>mp;
int ans,n;
bool vis[110];
inline int gcd(int n,int m)
{
    int r;
    if(n < m)
    {
        r = n;
        n = m;
        m = r;
    }
    while(n % m)
    {
        r = n % m;
        n = m;
        m = r;
    }
    return m;
}
inline void dfs(int cnt,int num)
{
    if(cnt == n / 2)
    {
        ans = max(ans,num);
        return;
    }
    int i,j;
    for(i=1;i<=n;i++) if(vis[i]==0) {vis[i]=1;break;}
    
    for(j = i + 1;j <= n;j++)
    {
        if(vis[j])
        {
            continue;
        }
        vis[j] = true;
        int r,a,b;
        if(z[i].x == z[j].x)
        {
            a = 400001;
            b = 400002;
        }
        else if(z[i].y == z[j].y)
        {
            a = 0;
            b = 0;
        }
        else
        {
            r = gcd(abs(z[i].x - z[j].x),abs(z[i].y - z[j].y));
            if((z[i].x - z[j].x) / r < 0)
            {
                r = -r;
            }
            a = (z[i].x - z[j].x) / r;
            b = (z[i].y - z[j].y) / r;
        }
        pa.first = a;
        pa.second = b;
        int sum = mp[pa] + num;
        ans = max(ans,sum);
        mp[pa]++;
        dfs(cnt + 1,sum);
        pa.first = a;
        pa.second = b;
        mp[pa]--;
        vis[j] = false;
    }
    vis[i] = false;
}
inline void init(void)
{
    memset(vis,false,sizeof(vis));
    mp.clear();
    ans = 0;
}
int main(){
    int i,j;
    while(~scanf("%d",&n))
    {
        init();
        for(i = 1;i <= n;i++)
        {
            scanf("%d %d",&z[i].x,&z[i].y);
        }
        dfs(0,0);
        printf("%d\n",ans);
    }
}
View Code

 

Medical Checkup

Thinking:pai爷 kk

Code :pai爷

技术分享图片
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
#define fpn() freopen("simple.in","r",stdin)
#define rd read()
using namespace std;
typedef long long ll;
const int maxn=100010;
int n,a[maxn],ans[maxn],t;
void init()
{
    scanf("%d%d",&n,&t);
    for(int i=1;i<=n;i++) scanf("%d",&a[i]);
}
void work()
{
    int q=a[1];
    ll sum=a[1];
    ans[1]=t/a[1]+1;
    for(int i=2;i<=n;i++)
    {
        sum+=a[i];
        if(a[i]>q) q=a[i];
        //printf("%d %d\n",sum,q); 
        if(t>=sum) ans[i]=(t-sum)/q+2;
        else ans[i]=1;
    }
    for(int i=1;i<=n;i++) printf("%d\n",ans[i]);
}
int main()
{
    init();
    work();
}
View Code

 

Black or White

 

Pizza Delivery

 

Rendezvous on a Tetrahedron

 

Starting a Scenic Railroad Service

Thinking:pai爷 kk

Code:kk zz

技术分享图片
#include<bits/stdc++.h>
#define clr(a,b) memset(a,b,sizeof(a))
#define fpn() freopen("simple.in","r",stdin)
#define rd read()
using namespace std;
typedef long long ll;
const int maxn=200010;
struct node {
    int a,b;
    friend bool operator <(const node &x,const node &y) {
        return x.a<y.a;
    }
} p[maxn];
int n;
multiset<int >s;
multiset<int >::iterator it;
int ans2=0,ans1=0,a[maxn],b[maxn];

void anss2() {
    sort(p+1,p+1+n);
    s.insert(0);
    for(int i=1; i<=n; i++) {
        it=lower_bound(s.begin(),s.end(),p[i].a);
        
        if(it==s.begin()) {
            s.insert(p[i].b-1);
        } else {
            it--;
            s.erase(it);
            s.insert(p[i].b-1);
        }
    }
}
void anss3(){
    int i;
    sort(p+1,p+1+n);
    priority_queue<int>q;
    q.push(-p[1].b + 1);
    ans2 = 1;
    for(i = 2;i <= n;i++)
    {
        //printf(" %d %d\n",p[i].a,-q.top());
        int pos = q.top();
        pos = -pos;
        if(p[i].a > pos)
        {
            q.pop();
            q.push(-p[i].b + 1);
        }
        else
        {
            ans2++;
            q.push(-p[i].b + 1);
        }
    }
}
void anss1()
{
    for(int i=1;i<=n;i++)
    {
        a[p[i].a]++;
        b[p[i].b]++;
    }    
    for(int i=1;i<=100000;i++) a[i]=a[i-1]+a[i],b[i]=b[i-1]+b[i];
    for(int i=1;i<=n;i++)
    {
        ans1=max(ans1,a[p[i].b-1]-b[p[i].a]);
    }
}
int main() {
    while(cin>>n) {
        s.clear();
        for(int i=1; i<=n; i++) {
            scanf("%d%d",&p[i].a,&p[i].b);
        }
        //anss2();
        anss3();
        anss1();
        //ans2=s.size();
        printf("%d %d\n",ans1,ans2);
    }
}
View Code

 

 

反思:

  zz:理解方法慢了一些,没有理解pai爷的思路,第一遍代码写挂了,第二遍本应该ac的代码,写错了0到n-1和1到n,拖延了半个小时左右。(确定自己实现队友想出的思路的时候,理解的是正确的)

  kk:B题样例没读懂。I题不知道multiset还存在被卡时间的可能。(换个人打,另外两个人讨论)

  pai爷:处理前缀和时i从0开始,数组越界;int类型输出lld,C题样例没读懂。(看题看的慢一点,交代码的时候检查细节)

2017-2018 ACM-ICPC, Asia Tsukuba Regional Contest

原文:https://www.cnblogs.com/mountaink/p/10446010.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!