队内赛(结束2019暑假)

1.HDU6247(水题)

解:对每个数*0.1向上取整相加;(还想拿一血结果少打了个++)

#include <iostream>
#include <cstdio>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn];

int main(){
    int flag=1;
    int T;
    cin>>T;
    while(T--){
        int n;
        cin>>n;
        int sum=0;
        for(int i=1;i<=n;i++){
            cin>>a[i];
            sum+=a[i];
            if(a[i]%10==0)sum+=a[i]*0.1;
            else sum+=a[i]*0.1+1;
        }
        cout<<"Case #"<<flag++<<": ";
        cout<<sum<<endl;
    }



    return 0;
}
View Code

2.HDU6015

解:map然后把相同课程存起来排序,把最大的两个加起来就行了;

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=210;
map<string,int>mp;
vector<int>a[maxn];
bool cmp(int x,int y){
    return x>y;
}
int main(){
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        for(int i=0;i<maxn;i++){
            a[i].clear();
        }
        mp.clear();
        int n;string s;
        cin>>n;
        int val;
        int tot=1;
        for(int i=1;i<=n;i++){
            cin>>s>>val;
            if(mp[s]==0){
                mp[s]=tot++;
                a[mp[s]].push_back(val);
            }
            else {
                a[mp[s]].push_back(val);
            }
        }
        for(int i=1;i<tot;i++){
            sort(a[i].begin(),a[i].end(),cmp);
        }
        int ans=0;
        for(int i=1;i<tot;i++){
            int len=a[i].size();
            for(int j=0;j<min(len,2);j++){
                ans+=a[i][j];
            }
        }
        cout<<ans<<endl;
    }



    return 0;
}
View Code

3.HDU6095

解:排序,从大到小,选取相差<k的;

#include <iostream>
#include <map>
#include <cstdio>
#include <cstring>
#include <string>
#include <algorithm>
#include <cmath>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
int a[maxn];
bool cmp(int x,int y){
    return x>y;
}
int main(){
    ios::sync_with_stdio(false);
    int T;
    cin>>T;
    while(T--){
        int n,k;
        cin>>n>>k;
        for(int i=1;i<=n;i++)cin>>a[i];
        sort(a+1,a+1+n,cmp);
        int ans=0;
        for(int i=1;i<=n;i++){
            if(a[i]-a[i+1]>k){
                ans++;
                break;
            }
            else {
                ans++;
            }
        }
        cout<<ans<<endl;
    }


    return 0;
}
View Code

4.HDU5978

解:只有0,1的可能,我一直在想2的可能,然后想死了。。

#include <bits/stdc++.h>
using namespace std;
int main(){
    int n;
    while(cin>>n){
        if(n%2)cout<<0<<endl;
        else cout<<1<<endl;

    }

    return 0;
}
View Code

5.CF977D

解:深搜一下。。。不知道我为啥当时没写下去,在宿舍写一发就过了;

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn=1e5+10;
ll a[maxn];
ll ans[maxn];
int n;
bool vis[maxn];
bool dfs(int x,int now){
    vis[x]=true;
    ans[now]=a[x];
    if(now==n){
        return true;
    }
    if(a[x]%3==0){
        ll w=a[x]/3LL;
        for(int i=1;i<=n;i++){
            if(!vis[i]&&a[i]==w){
                if(dfs(i,now+1))return true;
                else vis[i]=false;
            }
        }
    }
    ll w=a[x]*2LL;
    for(int i=1;i<=n;i++){
        if(!vis[i]&&a[i]==w){
            if(dfs(i,now+1))return true;
            else vis[i]=false;
        }
    }
    vis[x]=false;
    return false;

}

int main(){
    ios::sync_with_stdio(false);
    cin>>n;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    sort(a+1,a+1+n);
    for(int i=1;i<=n;i++){
        //for(int j=1;j<=n;j++)vis[j]=false;
        if(dfs(i,1)){
            //cout<<"YES"<<endl;
            for(int i=1;i<=n;i++)
                cout<<ans[i]<<' ';
            cout<<endl;
            break;
        }
    }


    return 0;
}
View Code

6.HDU5417

解:模拟题(照着模拟一遍就行了,数据都很小)

#include <iostream>
using namespace std;
int main(){
    int x,y,w,n;
    while(cin>>x>>y>>w>>n){
        int ans=0;
        while(n){
            n--;
            if(n==0)break;
            if(n-x/w>0){
                n-=x/w;
                ans+=(x+y);
            }
            else {

                ans+=n*w;n=0;
            }
        }
        cout<<ans<<endl;

    }

    return 0;
}
View Code

7.HDU4514

8.POJ3587

求最大三角形外接圆半径;枚举所有点;用海伦公式还一直T;

后来看了一下别人的,用向量积和正弦

#include <iostream>
#include <cmath>
#include <cstdio>
using namespace std;
const int maxn=1000+10;
const double pi=acos(-1.0);
pair<double,double>p[maxn];
double d[maxn][maxn];
double cross(double x1,double y1,double x2,double y2){
    return x1*y2-x2*y1;
}

int main(){
    int T;
    scanf("%d",&T);
    while(T--){
        int n;
        scanf("%d",&n);
        for(int i=1;i<=n;i++){
            scanf("%lf%lf",&p[i].first,&p[i].second);
        }
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                double dx=p[i].first-p[j].first;
                double dy=p[i].second-p[j].second;
                d[i][j]=d[j][i]=sqrt(1.0*(dx*dx+dy*dy));
            }
        }
        double ans=0.0;
        for(int i=1;i<=n;i++){
            for(int j=i+1;j<=n;j++){
                for(int k=j+1;k<=n;k++){
                    double a=d[i][j],b=d[i][k],c=d[j][k];
                    double w=fabs(cross(p[k].first-p[i].first,p[k].second-p[i].second,p[j].first-p[i].first,p[j].second-p[i].second));
                    ans=max(ans,1.0*d[i][j]*(d[j][k]/2.0)*(d[k][i]/w));
                }
            }
        }
        printf("%.3f\n",ans);

    }




    return 0;
}
View Code

9.HDU2426

带权二分图的匹配;当时没板子也不会写,看题就想到这个东西了~……

10.POJ3335

据说是半平面交求多边形核模板题~不懂……;

 

转载于:https://www.cnblogs.com/lin1874/p/11432645.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值