acm 12年浙江省赛复制题解 (签到队开题方式及思考)

队内复制了浙江12年的现场省赛,自己做D题罚时突破天际,还好队友给力拿了一道二进制的题目,勉勉强强打了7题排到70名,可以说是7道中的最低队伍了QAQ,拿牌机会渺茫。。。。
后面讲一下队伍整个开题流程和部分题目的题解,主要记录自己当时做题的流程及思路历程,为以后改进做准备Orz
A - Ace of Aces
队友先看懂题目,说是签到让继续往下看。

#include<map>
#include<set>
#include<stack>
#include<queue>
#include<string>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<iostream>
#include<algorithm>
#include<bits/stdc++.h>
#define pb push_back
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+5;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
bool cmp(int x,int y)
{
	return x>y;
}
bool flag;
ll m,n,k,t,x,ans,tmp,Max,a[maxn];
int main()
{
	ios::sync_with_stdio(false);
	cin.tie(0);cout.tie(0);
	cin>>t;
	while(t--)
	{
		flag=0;
		cin>>n;
		ans=minn;
		Max=minn;
		memset(a,0,sizeof a);
		for(int i=1;i<=n;i++)
		{
			cin>>x;
			a[x]++;
			if(a[x]>ans)
			{
				ans=a[x];
				tmp=x;
			}
			Max=max(Max,x);
		}
		sort(a+1,a+1+Max,cmp);
		if(a[1]==a[2])
		{
			cout<<"Nobody"<<endl;
			continue;
		}
		cout<<tmp<<endl;
	}
    return 0;
}

B - Team Formation ZOJ - 3870
B是关于二进制亦或运算的,一开始没思路先跳过,后来队友反过去开了,这里就只放代码了

#include<iostream>
#include<sstream>
#include<iterator>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<vector>
#include<bitset>
#include<climits>
#include<queue>
#include<iomanip>
#include<cmath>
#include<stack>
#include<map>
#include<new>
#include <complex>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mt(a,b) memset(a,b,sizeof(a))
#define pii pair<int, int>
#define pdd pair<double, double>
#define pid pair<int, double>
#define pdi pair<double. int>
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,b) for(int i=a;i<=b;i--)
#define ls (k<<1)
#define rs (k<<1|1)
#define mid ((l+r)>>1)
const int INF  =  0x3f3f3f3f;
const int mod  =  1e9+7;
const double PI  =  acos(-1.0);
const double E   =  2.718281828459;
const double eps = 1e-7;
const int maxn=100005;

int main()
{
    int t;
    cin>>t;
    while (t--){
        ll n,m;
        ll a[maxn],b[maxn];
        memset(b,0,sizeof(b));
        cin>>n;
        ll ans=0;
        for(ll i=1;i<=n;i++)
            cin>>a[i];
        sort(a+1,a+1+n);
        for(int i=1;i<=n;i++){
            int tmp=0;
            while(a[i]){
                tmp++;
                m=a[i]&1;
                if(m==0)
                    ans+=b[tmp];
                a[i]/=2;
            }
            b[tmp]++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

D题是我开的,是一个对于数字串取它的子串和,一开始想打暴力队友指出可能可以递推,接着开始对于每一个数字进行当前位置的最大和记录,如果后面出现一样的数字,就只能算一次了,通过打表找到了递推的规律。因为对递推的dbug中没有及时考虑数字范围导致T和Segmentation,WA出现

#include<bits/stdc++.h>
using namespace std;

#define inf 0x3f3f3f3f
using namespace std;
typedef long long ll;
const int maxn=1e6+6;
ll dp[maxn],jg[maxn],a[maxn];
int main()
{
    int t;
    cin>>t;
    while(t--){
        int n;
        cin>>n;
        memset(dp,0,sizeof(dp));
        memset(jg,0,sizeof(jg));
        ll ans=0;
        for(int i=1;i<=n;i++)
        {
            cin>>a[1];
            dp[i]=dp[i-1]+(i-jg[a[1]])*a[1];
            jg[a[1]]=i;
            ans+=dp[i];
        }
        cout<<ans<<endl;
    }
    system("pause");
    return 0;
}
	

G - Lunch Time
据说是签到,一发A,看看代码应该可以了

#include<bits/stdc++.h>
using namespace std;

#define pb push_back
using namespace std;
const int mod=1e9+7;
const int maxn=1e5+5;
typedef long long ll;
const int inf=0x3f3f3f3f;
const int minn=0xc0c0c0c0;
struct no
{
    int p;
    char s[105];
}a[maxn];
struct nod
{
    int p;
    char s[105];
}b[maxn];
struct node
{
    int p;
    char s[105];
}c[maxn];
bool cmp1(no a,no b)
{
    return a.p<b.p;
}
bool cmp2(nod a,nod b)
{
    return a.p<b.p;
}
bool cmp3(node a,node b)
{
    return a.p<b.p;
}
ll d,m,n,k,s,t,x,ans,tmp;
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);cout.tie(0);
    cin>>t;
    while(t--)
    {
        ans=0;
        cin>>s>>m>>d;
        for(int i=1;i<=s;i++)
            cin>>a[i].s>>a[i].p;
        sort(a+1,a+1+s,cmp1);
        for(int i=1;i<=m;i++)
            cin>>b[i].s>>b[i].p;
        sort(b+1,b+1+m,cmp2);
        for(int i=1;i<=d;i++)
            cin>>c[i].s>>c[i].p;
        sort(c+1,c+1+d,cmp3);
        ans+=a[s/2+1].p;
        ans+=b[m/2+1].p;
        ans+=c[d/2+1].p;
        cout<<ans<<" "<<a[s/2+1].s<<" "<<b[m/2+1].s<<" "<<c[d/2+1].s<<endl;
    }
    return 0;
}

H - May Day Holiday
特殊对闰年判断,而改变那天日期,签到题

#include<iostream>
#include<sstream>
#include<iterator>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<vector>
#include<bitset>
#include<climits>
#include<queue>
#include<iomanip>
#include<cmath>
#include<stack>
#include<map>
#include<new>
#include <complex>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mt(a,b) memset(a,b,sizeof(a))
#define pii pair<int, int>
#define pdd pair<double, double>
#define pid pair<int, double>
#define pdi pair<double. int>
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,b) for(int i=a;i<=b;i--)
#define ls (k<<1)
#define rs (k<<1|1)
#define mid ((l+r)>>1)
const int INF  =  0x3f3f3f3f;
const int mod  =  1e9+7;
const double PI  =  acos(-1.0);
const double E   =  2.718281828459;
const double eps = 1e-7;
const int maxn=10005;
int check(int y){
    if(y%400==0)
        return 1;
    else
    {
        if(y%4==0&&y%100!=0)
            return 1;
        else
            return 0;
    }
}
int main()
{
    int t;
    cin>>t;
    while (t--){
        int y;
        cin>>y;
        int sum,sum2;
        sum=y-1928;
        int sum1=0;
        for(int i=1;i<=sum;i++){
            if(check(1928+i))
                sum1+=2;
            else
                ++sum1;
        }
       sum2=sum1%7;
        if(sum2==0||sum2==5)
            cout<<"6"<<endl;
        if(sum2==1||sum2==2||sum2==3||sum2==4)
            cout<<"5"<<endl;
        if(sum2==6)
            cout<<"9"<<endl;
    }
    return 0;
}

J - Convert QWERTY to Dvorak
纯模拟,最后卡了一个gets的问题,12年的编译器不支持QAQ,队友和我打的心态炸裂。。。
不放代码了,我们是一个一个字符判断输入输出,只要搞清楚” 和‘ ’输入就行了
L - Demacia of the Ancients
我写的裸签到=v=

#include<iostream>
#include<sstream>
#include<iterator>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>
#include<set>
#include<vector>
#include<bitset>
#include<climits>
#include<queue>
#include<iomanip>
#include<cmath>
#include<stack>
#include<map>
#include<new>
#include <complex>
using namespace std;
#define ll long long
#define ull unsigned long long
#define mt(a,b) memset(a,b,sizeof(a))
#define pii pair<int, int>
#define pdd pair<double, double>
#define pid pair<int, double>
#define pdi pair<double. int>
#define fr(i,a,b) for(int i=a;i<=b;i++)
#define fo(i,a,b) for(int i=a;i<=b;i--)
#define ls (k<<1)
#define rs (k<<1|1)
#define mid ((l+r)>>1)
const int INF  =  0x3f3f3f3f;
const int mod  =  1e9+7;
const double PI  =  acos(-1.0);
const double E   =  2.718281828459;
const double eps = 1e-7;
const int maxn=10005;

int main()
{
    int t;
    cin>>t;
    while (t--){
        int n;
        cin>>n;
        int ans=0;
        for(int i=1;i<=n;i++)
        {
            int num;
            cin>>num;
            if(num>6000)
                ans++;
        }
        cout<<ans<<endl;
    }
    return 0;
}

后面还读了K题,应该是个大模拟,可惜没人能做出来了,等省赛结束后取补一补。。。。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值