The 12th Zhejiang Provincial Collegiate Programming Contest

A - Ace of Aces

题意:数字代表选的那个人,票数最多的当选,如果出现最高票有多个人,否则输出Nobody

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
int a[1005];
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        memset(a,0,sizeof(a));
        for(int i=0;i<n;i++){
            int x;
            cin>>x;
            a[x]++;
        }
        int maxnum=0,pos,flag=0;
        for(int i=1;i<=1000;i++){
            if(a[i]>maxnum){
                maxnum=a[i];
                pos=i;
            }
        }
        for(int i=1;i<=1000;i++){
            if(a[i]==maxnum&&pos!=i){
                flag=1;
                break;
            }
        }
        if(flag)
            cout<<"Nobody"<<endl;
        else cout<<pos<<endl;
    }
    return 0;
}


B - Team Formation

题意:每个人都有各自的能力值,如果两个人的能力值异或之后大于他俩,那么就是一个成功的配对,求总配对数.关键点就是开出数组来保存他们二进制中第一个1的位置,然后每次比较较小的数中的第一个1位置在较大数中对应位的异或值,

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
int a[100005];
int pos[100005];//最高位
int b[35];//某最高位的个数
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        int n,ans=0;
        cin>>n;
        memset(b,0,sizeof(b));
        for(int i=0; i<n; i++)
            cin>>a[i];
        sort(a,a+n);
        for(int i=0; i<n; i++)
        {
            for(int j=31; j>=0; j--)
            {
                if(a[i]&(1<<j))
                {
                    pos[i]=j;
                    b[j]++;
                    break;
                }
            }
        }
        for(int i=0; i<n; i++)
        {
            int j=pos[i];
            while(j>=0)
            {
                if(!(a[i]&(1<<j)))
                    ans+=b[j];
                j--;
            }
            //cout<<ans<<endl;
        }
        cout<<ans<<endl;
    }
    return 0;
}

C- Convex Hull(凸包)

挖坑待填

D - Beauty of Array

题意:给出一串数组,取其中连续子串,元素求和就是该数字串的beauty值.求整体beauty值.

关键在于记录数字位置,当一个数未出现过,那么这个数对先前所有子串都有贡献(也就是可以在先前所有字串中加入这一元素),如果出现过,那么只对当前位置与先前位置之间的子串有贡献.

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005

int a[1000005];
int numpos[1000005];
ll int temp[1000005];
using namespace std;
int main()
{
    int t,n;
    cin>>t;
    while(t--)
    {
        ll ans=0;
        memset(numpos,-1,sizeof(numpos));
        cin>>n;
        for(int i=0;i<n;i++)
            cin>>a[i];
        for(int i=0;i<n;i++){
                ans+=a[i];
            if(numpos[a[i]]==-1){
                numpos[a[i]]=i;
                ans+=a[i]*i;
            }
            else {
                ans+=a[i]*(i-numpos[a[i]]-1);
                numpos[a[i]]=i;
            }
            temp[i]=ans;
        }
        ans=0;
        for(int i=0;i<n;i++)
            ans+=temp[i];
        cout<<ans<<endl;
    }

    return 0;
}

E - Floor Function

这道题题解暂时还未找到

F - Permutation Graph

挖坑待填

G - Lunch Time

题意:有三种,每种选一个中等价格的.求价格总和,再输出各个菜,其实就是定义结构,然后排序,直接定位出中位数

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<map>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
struct Node
{
    char s[60];
    int num;
}x[120],y[120],z[120];
bool cmp(Node a,Node b)
{
    return a.num < b.num;
}
using namespace std;
int main()
{
    int t;
    cin>>t;
    while(t--)
    {
        memset(x,0,sizeof(x));
        memset(y,0,sizeof(y));
        memset(z,0,sizeof(z));
        int s,m,d;
        int total;
        cin>>s>>m>>d;
        for(int i=0;i<s;++i)
            cin>>x[i].s>>x[i].num;
        sort(x,x+s,cmp);
        for(int i=0;i<m;++i)
            cin>>y[i].s>>y[i].num;
        sort(y,y+m,cmp);
        for(int i=0;i<d;++i)
            cin>>z[i].s>>z[i].num;
        sort(z,z+d,cmp);
        total = x[s/2].num + y[m/2].num + z[d/2].num;
        cout<<total<<" "<<x[s/2].s<<" "<< y[m/2].s <<" "<< z[d/2].s <<endl;
    }
    return 0;
}
 

H - May Day Holiday

题意:问五一假期有多少天,其实无非就7个答案,然后先算出1928,然后在一年年推,非常快

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<map>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005

using namespace std;
int day[]={6,9,6,5,5,5,5};

int leap(int y)
{
    if(y%400==0 || (y%4==0&&y%100!=0))
        return 1;
    return 0;
}
int main(){
    int t,n;
    cin>>t;
    while(t--){
        cin>>n;
        int d=2,y=1928;
        if(n==y)
            cout<<day[d]<<endl;
        else {
            while(n>y){
                y++;
                if(leap(y))
                    d+=366;
                else d+=365;
                d%=7;
            }
            cout<<day[d]<<endl;
        }
    }
    return 0;
}


I - Earthstone Keeper

挖坑待填

J - Convert QWERTY to Dvorak

题意:直接map

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<map>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
int a[1005];
using namespace std;
int main()
{
    map<char,char>mp;
    mp['_'] = '{';
    mp['-'] = '[';
    mp['+'] = '}';
    mp['='] = ']';
    mp['Q'] = '"';
    mp['q'] = '\'';
    mp['W'] = '<';
    mp['w'] = ',';
    mp['E'] = '>';
    mp['e'] = '.';
    mp['R'] = 'P';
    mp['r'] = 'p';
    mp['T'] = 'Y';
    mp['t'] = 'y';
    mp['Y'] = 'F';
    mp['y'] = 'f';
    mp['U'] = 'G';
    mp['u'] = 'g';
    mp['I'] = 'C';
    mp['i'] = 'c';
    mp['O'] = 'R';
    mp['o'] = 'r';
    mp['P'] = 'L';
    mp['p'] = 'l';
    mp['{'] = '?';
    mp['['] = '/';
    mp['}'] = '+';
    mp[']'] = '=';
    mp['S'] = 'O';
    mp['s'] = 'o';
    mp['D'] = 'E';
    mp['d'] = 'e';
    mp['F'] = 'U';
    mp['f'] = 'u';
    mp['G'] = 'I';
    mp['g'] = 'i';
    mp['H'] = 'D';
    mp['h'] = 'd';
    mp['J'] = 'H';
    mp['j'] = 'h';
    mp['K'] = 'T';
    mp['k'] = 't';
    mp['L'] = 'N';
    mp['l'] = 'n';
    mp[':'] = 'S';
    mp[';'] = 's';
    mp['"'] = '_';
    mp['\''] = '-';
    mp['Z'] = ':';
    mp['z'] = ';';
    mp['X'] = 'Q';
    mp['x'] = 'q';
    mp['C'] = 'J';
    mp['c'] = 'j';
    mp['V'] = 'K';
    mp['v'] = 'k';
    mp['B'] = 'X';
    mp['b'] = 'x';
    mp['N'] = 'B';
    mp['n'] = 'b';
    mp['<'] = 'W';
    mp[','] = 'w';
    mp['>'] = 'V';
    mp['.'] = 'v';
    mp['?'] = 'Z';
    mp['/'] = 'z';

    string s;
    while(getline(cin,s))
    {
        for(int i = 0;i<s.size();++i)
        {
            if(mp.find(s[i]) != mp.end())
                s[i] = mp[s[i]];
        }
        cout<<s<<endl;
    }
    return 0;
}

K - Capture the Flag

题意:模拟

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<map>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int n,q,p,c;
struct team
{
    int id;
    int ranklist;
    double score;
} a[105];
int vis[105][105][15],defen[105];
bool cmp1(team x,team y){
return x.score>y.score;
}
bool cmp2(team x,team y){
return x.id<y.id;
}
int main()
{
    int t;
    scanf("%d",&t);
    while(t--)
    {
        scanf("%d%d%d%d",&n,&q,&p,&c);
        for(int i=1; i<=n; i++) //初始化
        {
            a[i].id=i;
            a[i].ranklist=1;
            a[i].score=p;
        }
        while(c--)//攻击
        {
            int k;
            memset(vis,0,sizeof(vis));
            scanf("%d",&k);//攻击方式
            while(k--)
            {
                int atk,def,sev;
                scanf("%d%d%d",&atk,&def,&sev);
                if(vis[atk][def][sev])
                    continue;
                vis[atk][def][sev]=1;
            }
            int cnt;
            double av;
            for(int k=1; k<=q; k++)
            {
                for(int j=1; j<=n; j++)
                {
                    cnt=0;
                    for(int i=1; i<=n; i++)//统计攻击
                        if(vis[i][j][k])
                            cnt++;
                    if(cnt==0)
                        continue;
                    a[j].score-=(n-1);
                    av=(n-1)*1.0/cnt;
                    for(int i=1; i<=n; i++)//加回去
                        if(vis[i][j][k])
                            a[i].score+=av;
                }
            }
            int z;
            for(int i=1; i<=q; i++)//每个服务器防御
            {
                memset(defen,0,sizeof(defen));
                cnt=0;
                for(int j=1; j<=n; j++)//每个队伍
                {
                    scanf("%d",&z);
                    if(z==1)
                    {
                        defen[j]=1;//有防御的标记,统计
                        cnt++;
                    }
                    else
                    {
                        defen[j]=0;//没防御的直接减掉
                        a[j].score-=(n-1);
                    }
                }
                if(cnt==n)
                    continue;
                av=(n-1)*1.0/cnt;
                av=av*(n-cnt);
                for(int j=1; j<=n; j++)//加上去
                {
                    if(defen[j])
                        a[j].score+=av;
                }
            }
            sort(a+1,a+1+n,cmp1);//按分数排名定rank
            a[1].ranklist=1;
            for(int j=2;j<=n;j++){
                if(fabs(a[j].score-a[j-1].score)<0.000001)
                    a[j].ranklist=a[j-1].ranklist;
                else a[j].ranklist=j;
            }
            sort(a+1,a+1+n,cmp2);//按id排名给出询问结果
            int ques,ask;
            scanf("%d",&ques);
            for(int j=0;j<ques;j++){
                scanf("%d",&ask);
                printf("%.10lf %d\n",a[ask].score,a[ask].ranklist);
            }
        }
    }
return 0;
}

L - Demacia of the Ancients

题意:找大于6000的数

#include<iostream>
#include<algorithm>
#include<string>
#include<vector>
#include<cmath>
#include<stack>
#include<string.h>
#include<stdlib.h>
#include<cstdio>
#include<cstdlib>
#include<queue>
#define mod 1e9+7
#define ll long long
#define MAXSIZE 100005
using namespace std;
int main()
{
    int t;
    cin >>t;
    while(t--)
    {
        int n,x;
        int ans = 0;
        scanf("%d",&n);
        for(int i = 0;i<n;++i)
        {
            scanf("%d",&x);
            if(x > 6000)
                ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}







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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值