codeforces round239 DIV2

p1 Line to Cashier

超市排队结账,每扫描一件商品需要5秒,每个顾客需要15秒付钱。给出每个窗口的人数和每个人买的商品数,求排在最快的队伍时,最少要等多少时间。模拟...

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <algorithm>
using namespace std;
typedef long long ll;
int n,m,ans;
int a[20000];
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&n);
    for (int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    ans=99999999;
    int x,y,z;
    for (int i=1; i<=n; i++)
    {
        z=0;
        for (int j=1; j<=a[i]; j++)
        {
            scanf("%d",&x);
            z+=(x*5);
            z+=15;
        }
        ans=min(z,ans);

    }
    cout<<ans<<endl;
    return 0;
}

P2: Garland

这题其实我没看懂题意,看了看数据,感觉就是统计一下两个串里相同的字符出现了多少次,并且B串中每个字符一定要在A中出现过一次,否则就是-1.

#include <iostream>
#include <cstring>
#include <cmath>
#include <algorithm>
#include <map>
#include <cstdio>
using namespace std;
typedef long long ll;
int a[100];
char s[1200],s1[1200],s2[1200];
int n,m,p;
int main()
{
//    freopen("in.txt","r",stdin);
    gets(s1);
    gets(s2);
    int l1=strlen(s1);
    int l2=strlen(s2);
    memset(a,0,sizeof a);
    for (int i=0; i<l1; i++)
    {
        a[s1[i]-'a']++;
    }
    int ct=0;
    bool ok=true;
    for (int i=0; i<l2; i++)
    {
        if (a[s2[i]-'a']==0)
        {
            ok=false;
            break;
        }
    }
    if (ok)
    {

        for (int i=0; i<l2; i++)
        {
            if (a[s2[i]-'a']>0)
            {
                a[s2[i]-'a']--;
                ct++;
            }
        }
    }
    if (ct>0) cout<<ct<<endl;
    else cout<<"-1"<<endl;
    return 0;
}

p3: Triangle

给直角三角形的两个边的长度a,b,在平面中找到3个点,使得三个点组成直角三角形并且其中两条边等于所给的两个长度。在第一象限中找到所有符合到原点距离等于a的格点,在第四象限中找到所有符合到原点距离等于b的格点,然后二重循环这两个集合,如果每一组配对可以组成直角,并且y坐标不相等就是一组符合的解。

#include <iostream>
#include <cstring>
#include <cmath>
#include <cstdio>
#include <map>
#include <vector>
using namespace std;
typedef long long ll;
int n,m;
int k,x,y,z;
int p[11000];
bool f[1010000];
int id[1010000];
int a,b;
int ans[5][2];
const int maxn=1000*1000;

int gcd(int x,int y)
{
    if (y==0) return x;
    return gcd(y,x%y);
}
int dis(int x1,int y1,int x2,int y2)
{
    return (x1-x2)*(x1-x2)+(y1-y2)*(y1-y2);
}
struct node
{
    int x,y;
    node()
    {

    }
    node(int a,int b)
    {
        x=a; y=b;
    }
};

int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d%d",&a,&b);
    vector<node>n1,n2;

    if (a>b) swap(a,b);
    ans[0][0]=0;
    ans[0][1]=0;
    int x,y,z;
    bool ok=false;
   for (int i=1; i<=1000; i++)
    for (int j=1; j<=1000; j++)
    {
        if (dis(0,0,i,j)==a*a)
        {
            n1.push_back(node(i,j));
        }
    }

    for (int i=1; i<=1000; i++)
    for (int j=1; j<=1000; j++)
    {
        if (dis(0,0,i,j)==b*b)
        {
            n2.push_back(node(i,j));
        }
    }
    for (int i=0; i<n1.size(); i++)
     for (int j=0; j<n2.size(); j++)
     {
         if (n1[i].x*n2[j].x==n1[i].y*n2[j].y && n1[i].y!=n2[j].y)
         {
             ans[1][0]=n1[i].x;
             ans[1][1]=n1[i].y;
             ans[2][1]=n2[j].y;
             ans[2][0]=-n2[j].x;
             ok=true;
             i=n1.size();
             j=n2.size();

         }
         if (ok) break;
              }
    if (ok)
    {
    puts("YES");
    for (int i=0; i<3; i++)
    cout<<ans[i][0]<<" "<<ans[i][1]<<endl;
    }
    else
    {
        puts("NO");
    }
    return 0;
}

P4: Long Path

每个点,有两个通道,第一条通道通向i+1,第二条通道通向a[i],现在问要从1到n+1,要走多少次通道。算是个Dp把,记录一下dp[k]为从k到k+1需要穿过多少条通道,那么如果在节点i,有a[i]的话,i到i+1所走的通道数就是dp[a[i],a[i]+1,a[i]+2,...i-1].这样实际上每个点只算一次,然后记录下来下次直接调用就好了。

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cstring>
#include <cmath>
using namespace std;
typedef long long ll;
int n,m;
ll dp[3333];
int a[3333];
int x,y,z;
const int mod=1000000007;

ll work(int x,int y)
{
    if (x==y) return dp[y]=2;
    if (x==0) return x;
    ll res=2;
    if (dp[y]!=-1) return dp[y];
    int k=y;
    for (int i=a[k]; i<=k-1; i++)
    res+=work(a[i],i);
    res%=mod;
    dp[y]=res;
    return res;
}
int main()
{
//    freopen("in.txt","r",stdin);
    scanf("%d",&n);
    for (int i=1; i<=n; i++)
    {
        scanf("%d",&a[i]);
    }
    ll ans=0;
    memset(dp,-1,sizeof dp);

    dp[0]=0;
    for (int i=1; i<=n; i++)
    {

        ans+=work(a[i],i);
        ans%=mod;
//        dp[i]=ans;
//        ans++;
    }
    cout<<ans<<endl;
    return 0;
}


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值