2015年江西理工大学C语言程序设计竞赛(高级组)

A

解法:DP+二分

dp[i]=max(dp[i],dp[j]+p[i].v)(i>j)

dp[i]表示建立i点之后能够获得的最大值

int n,M;

struct node
{
    int l,v;
}p[1010];
int dp[1010];

bool cmp(node a,node b){
    return a.l < b.l;
}

bool judge_oo(){
    int Max = -1;
    for(int i = 1;i <= n;i++) Max = max(Max,p[i].v);
    if(Max >= M) return 1;
    return 0;
}

bool judge_no(){
    int sum = 0;
    for(int i = 1;i <= n;i++) sum += p[i].v;
    if(sum >= M) return 0;
    return 1;
}

bool judge_DP(int L){
    memset(dp,0,sizeof dp);
    for(int i = 1;i <= n;i++){
        for(int j = 0;j < i; j++){
            if(p[i].l - p[j].l >= L){
                dp[i] = max(dp[i],dp[j] + p[i].v);
            }
        }
    }
    int ML = 0;
    for(int i = 1;i <= n;i++) ML = max(ML,dp[i]);
    if(ML >= M) return 1;
    return 0;
}

int solve(int L,int R){
    while(L + 1 < R){
        int mid = (L + R)/2;
        if(judge_DP(mid)) L = mid;
        else R = mid;
    }
    return L;
}

int main(int argc, char *argv[])
{
    //freopen("data.in","r",stdin);
    //freopen("data.out","w",stdout);
    int T;
    cin >> T;
    while(T--){
        cin >> n >> M;
        for(int i = 1;i <= n;i ++)
            cin >> p[i].l >> p[i].v;
        if(judge_no()){
            puts("-1");
            continue;
        }
        if(judge_oo()){
            puts("oo");
            continue;
        }
        sort(p+1,p+n+1,cmp);
        p[0].l = -100000000 , p[0].v = 0;
        int L = 1 , R = p[n].l;
        cout << solve(L,R) << endl;
    }
    return 0;
}

B

解法:模拟。字符串模拟

#include<stdio.h>
//#include<bits/stdc++.h>
#include<string.h>
#include<iostream>
#include<math.h>
#include<sstream>
#include<set>
#include<queue>
#include<map>
#include<vector>
#include<algorithm>
#include<limits.h>
#define inf 0x3fffffff
#define INF 0x3f3f3f3f
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define LL long long
#define ULL unsigned long long
using namespace std;
int i,j;
int n,m;
int num_1,num_2;
int t;
int sum,ans,flag;
string s_1,s_2,s_3;
string sss;
string ss[10000];
string c;
map<string,int>q1;
map<string,int>q2;
int main()
{
    cin>>t;
    while(t--)
    {
        cin>>n>>c;
        num_1=0;
        for(i=0; i<n; i++)
        {
            cin>>sss;
            ans=sss.find(".");
            s_1=sss.substr(0,ans);
            s_2=sss.substr(ans+1,sss.length());
            if(s_2==c)
            {
                int ans_2=sss.find("(");
                int ans_3=sss.find(")");
                if((ans_2!=-1&&ans_2<ans_3))
                {
                    //  num_1++;
                    ss[num_1++]=sss.substr(0,ans_2);
                    //  cout<<sss.substr(0,ans_2)<<endl;
                }
                else if(ans_2==-1||ans_3==-1)
                {
                    //  num_1++;
                    ss[num_1++]=sss.substr(0,ans);
                    //    cout<<sss.substr(0,ans)<<endl;
                }
            }
        }
        for(i=0; i<num_1; i++)
        {
            //      cout<<ss[i]<<"A"<<endl;
        }
        // cout<<num_1<<endl;
        for(i=0; i<num_1; i++)
        {
            q1[ss[i]]++;
        }
        for(i=0; i<num_1; i++)
        {
            if(q2[ss[i]]==0)
            {
                q2[ss[i]]=1;
                if(q1[ss[i]]==1)
                {
                    cout<<ss[i]<<"."<<c<<endl;
                }
                else
                {
                    cout<<ss[i]<<"."<<c<<" "<<q1[ss[i]]<<endl;
                }
            }
        }
        q1.clear();
        q2.clear();
    }
    return 0;
}

C

解法:树状数组寻找逆序对+预处理

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cmath>

using namespace std;

const int M = 200010;

long long ans[M + 10];
int G[M + 10],c[M + 10];

int Lowbit(int x)
{
    return x & (-x);
}

void Insert(int x,int d)
{
    while(x<=M){
        c[x]+=d;
        x+=Lowbit(x);
    }
}

int Sum(int x)
{
    int sum=0;
    while(x>0){
        sum+=c[x];
        x-=Lowbit(x);
    }
    return sum;
}

void init()
{
    memset(G,-1,sizeof G);
    memset(ans,0,sizeof ans);
    memset(c,0,sizeof c);
    G[1] = 1;
    for(int i = 2; i <= 200100;i++){
        if(G[i] == -1){
            for(int j = i;j <= 200100;j += i){
                if(G[j] == -1){
                    G[j] = i;
                }
            }
        }
    }
    for(int i=1;i<=200005;i++)
    {
        Insert(G[i],1);
        ans[i] = ans[i-1] + (i-Sum(G[i]));
    }
}

int main()
{
    init();
    int t;
    cin>>t;
    while(t--)
    {
        int n;
        cin>>n;
        cout<<ans[n]<<endl;
    }
    return 0;
}

D

解法:模版题,最小覆盖圆

#include<iostream>
#include<cmath>
#include<cstdio>
#include<algorithm>
using namespace std;
const double eps=1e-8;
struct Point{
    double x,y;
}p[505];
double dis(const Point &a,const Point &b)
{
    return sqrt((a.x-b.x)*(a.x-b.x)+(a.y-b.y)*(a.y-b.y));
}
Point circumcenter(const Point &a,const Point &b,const Point &c)
{ //返回三角形的外心
    Point ret;
    double a1=b.x-a.x,b1=b.y-a.y,c1=(a1*a1+b1*b1)/2;
    double a2=c.x-a.x,b2=c.y-a.y,c2=(a2*a2+b2*b2)/2;
    double d=a1*b2-a2*b1;
    ret.x=a.x+(c1*b2-c2*b1)/d;
    ret.y=a.y+(a1*c2-a2*c1)/d;
    return ret;
}
void min_cover_circle(Point *p,int n,Point &c,double &r){ //c为圆心,r为半径
    random_shuffle(p,p+n); //
    c=p[0]; r=0;
    for(int i=1;i<n;i++)
    {
        if(dis(p[i],c)>r+eps)  //第一个点
        {
            c=p[i]; r=0;
            for(int j=0;j<i;j++)
                if(dis(p[j],c)>r+eps) //第二个点
                {
                    c.x=(p[i].x+p[j].x)/2;
                    c.y=(p[i].y+p[j].y)/2;
                    r=dis(p[j],c);
                    for(int k=0;k<j;k++)
                        if(dis(p[k],c)>r+eps) //第三个点
                        {//求外接圆圆心,三点必不共线
                            c=circumcenter(p[i],p[j],p[k]);
                            r=dis(p[i],c);
                        }
                }
        }
    }
}
int main(){
    int n;
    Point c;
    double r;
    int t;
    cin>>t;
    while(t--)
    {
        cin>>n;
        for(int i=0; i<n; i++)
            scanf("%lf%lf",&p[i].x,&p[i].y);
        min_cover_circle(p,n,c,r);
        printf("%.1f %.1f\n",c.x,c.y);
    }

    return 0;
}
时间: 2024-10-22 04:41:49

2015年江西理工大学C语言程序设计竞赛(高级组)的相关文章

2017年江西理工大学C语言程序设计竞赛(高级组)

问题 A: 求近似值 1 #include <stdio.h> 2 #include <time.h> 3 #include <stdlib.h> 4 using namespace std; 5 6 #define ll long long 7 const ll M = 9e18; 8 const ll MOD = 9932017; 9 struct Node { 10 ll m[2][2]; 11 }; 12 13 ll a[4966010]; 14 15 Node

2018年江西理工大学C语言程序设计竞赛(高级组) 三角平方数

题目描述 三角数:形如图a,圆点摆放成等边三角形的数字,则为三角数. (图a) 平方数:形如图b,小方块摆放成正方形的数字,则为平方数. (图b) 那么如果一个数字既是三角形数又是平方数,则称为三角平方数.很显然我们知道第一个三角平方数就是1了. 那么第n个三角平方数是哪个呢? 输入 输入一个正整数n (1≤n≤2001≤n≤200) 输出 输出第n个三角平方数 样例输入 1 样例输出 1 提示 来源 ismdeep 提交 我的状态 ? 2018  JustOJ     中文  English 

2015年江西理工大学C语言程序设计竞赛(初级组)

JankTao相亲记 解法:排序 #include<stdio.h> #include<string.h> #include<iostream> #include<math.h> #include<map> #include<set> #include<vector> #include<algorithm> using namespace std; const double INF = 1e20; const

2016年江西理工大学C语言程序设计竞赛(初级组)

Problem Description 华盛顿在寝室洗衣服,遭到了xyf的嫌弃,于是xyf出了道题给华盛顿来做(然而并没有什么关系-v-!)xyf扔给华盛顿n个字符串,这些字符串的长度不超过10000并且没有空串.有Q个询问,每个询问一个k,求出这n个字符串中的子串包含了第k个字符串的个数(详情请看hint) Input 多组测试.每组测试先输入n,Q表示n个字符串,Q个询问.(1<= n ,Q <=1e4)接下来n行每行一个字符串si,(1<= |si| <= 1e4)再接下来Q

2013年江西理工大学C语言程序设计竞赛(初级组)

ACM ICPC WORLD FINAL 解法:排序大家都知道,去重的话,初学者用数组就好了 #include<algorithm> #include<iostream> using namespace std; int main() { int a,b,c[100],i,d[31]; cin>>a; while(a>0) { cin>>b; for(i=0;i<31;i++) d[i]=0; for(i=0;i<b;i++) { cin&

开锁魔法II 哈尔滨理工大学第五届ACM程序设计竞赛

规律:a[i][j]=     1/i * a[i-1][j-1]      +      (i-1)/i * a[i-1][j];  (少一个盒子时使用j-1 次魔法的概率)   (少一个盒子时使用j次魔法的概率) 公式推导如下: 设a[i][j]为打开i个盒子正好需要j次魔法的情况. ① 1->1 ② 1->1 , 2->2;        两次 1->2 , 2->1;        一次 ③ 1->1 , 2->2 , 3->3;     三次 1-

补番计划 (长沙理工大学第十一届程序设计竞赛)(双端队列+set容器+string)

补番计划 Time Limit : 4000/2000ms (Java/Other)   Memory Limit : 65535/32768K (Java/Other) Total Submission(s) : 8   Accepted Submission(s) : 1 Font: Times New Roman | Verdana | Georgia Font Size: ← → Problem Description 阿聪是一个日漫狂魔.暑假在家的时候,他有12小时在补番,12小时在睡

2015.10.19 福州大学第九届程序设计竞赛

FZU 2086 餐厅点餐 枚举 练的时候以为是dp---(事实上这场只做了10来分钟---就愉快地滚去吃饭了---) 1 #include<cstdio> 2 #include<cstring> 3 #include<iostream> 4 #include<algorithm> 5 using namespace std; 6 int A,B,C,D,E; 7 int a[15];//汤 8 int b[15];//饭 9 int c[15];//面 1

2015湘潭市第七届大学生程序设计竞赛 —— Fraction

题目大意: 小数化分数,但是分母限制在[1,1000],很明显的枚举,但是在赛场上的时候傻逼了,无论怎么枚举,怎么二分就是wa,wa到死···········. (ps:我要给出题人寄刀片~~~~),这个题目需要注意的是有可能输出0/1. 1 #include <cmath> 2 #include <cstdio> 3 #include <cstring> 4 #include <iostream> 5 #include <algorithm>