第四届“传智杯”全国大学生IT技能大赛(初赛A组)

思维还是不够,只过了三题。还是不知道自己能不能够进复赛,太菜了自己。
还是要多做思维题。

A题
签到题,根据题意写即可。

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>

using namespace std;

int n,T; 
int a[1005],amax,amin=inf;

void ready()
{
	cin>>n;
	_for(i,1,n)
	{
		cin>>a[i];
		amin=min(amin,a[i]);
		amax=max(amax,a[i]);
	}
}

void work()
{
	int d=amax-amin;
	_for(i,1,n)
	{
		cout<<100*(a[i]-amin)/d<<' ';
	}
}

int main()
{
    ready();   
    work();
    return 0;
}

B题
思维题,用二进制去思考。这题当时没有做出来,感谢楊哥赛后指点。
对于一个数x,假设x的二进制为101101。从左往右扫,当扫到第5位为1的时候,当y的这一位为0,后面位数任意时,这个y是必定小于x的。而由于后面位数任意,则x异或y的值必定大于25小于26-1。用前缀和统计这个区间内素数的个数,这样就能计算出答案。然后继续往下扫,扫到第k位为1,则则x异或y的值必定大于2k小于2k+1-1。

(因为洛谷交不了这题,不知道补题的代码对不对)

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>

using namespace std;

const int N=2e6+1e5;

int n,T; 

ll sum[N+100],primes[N+100],pi;


void ready()
{ 
	_for(i,2,N)
	  sum[i]=1;
	_for(i,2,N)
	{
		if(sum[i]) primes[++pi]=i;
		for(int j=1;primes[j]<=N/i;j++)
		{
			sum[i*primes[j]]=0;
			if(i%primes[j]==0) break;
		}
	}
	_for(i,1,N)
	  sum[i]+=sum[i-1];
	cin>>T;
}

int qsm(int x,int y)
{
	int cnt=1;
	while(y)
	{
		if(y&1) cnt*=x;
		x=x*x;
		y>>=1;
	}
	return cnt;
}

void work()
{
	int x,t=0;
	ll ans=0;
	cin>>x;
	while(x)
	{
		if(x&1)
		{
			ans+=sum[qsm(2,t+1)-1]-sum[qsm(2,t)-1];
		}
		t++;
		x>>=1;
	}
	cout<<ans<<'\n';
}

int main()
{
    ready();  
	while(T--) 
      work();
    return 0;
}

C题
用map去储存每个字段名所对应是第几个字段,然后用vector暴力去做即可。
注意,宏定义for之后是≤,注意写的时候的细节。

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>

using namespace std;

int n,T,k,cnt; 
vector<int> v[105];
map<int,int> m;

void ready()
{
	cin>>n>>k;
}

void work()
{
	int t;
	cin>>t;
	if(t==1)
	{
		int p;
		cin>>p;
		_for(i,1,p){
			int x,y;
			cin>>x>>y;
			if(!m[x]) m[x]=++cnt;
			v[m[x]].push_back(y);
		}
	}
	else
	{
		int x,ymin,ymax,ans=0;
		cin>>x>>ymin>>ymax;
		x=m[x];
		_for(i,0,v[x].size()-1)
		  if(v[x][i]>=ymin && v[x][i]<=ymax)
		    ans++;
		cout<<ans<<'\n';
	}
}

int main()
{
    ready();   
    while(n--)
    work();
    return 0;
}

E题
易得,只有2和3这两个质数异或值为1,其他都不为1。

#include <iostream>
#include <stdio.h>
#include <cstdio>
#include <stdlib.h>
#include <string>
#include <string.h>
#include <cstring>
#include <math.h>
#include <cmath>
#include <queue>
#include <stack>
#include <vector>
#include <map>
#include <algorithm>
#define _for(i,a,b) for(int i=(a) ;i<=(b) ;i++)
#define _rep(i,a,b) for(int i=(a) ;i>=(b) ;i--)
#define mst(v,s) memset(v,s,sizeof(v))
#define IOS ios::sync_with_stdio(false),cin.tie(0)
#define ll long long
#define INF 0x7f7f7f7f7f7f7f7f
#define inf 0x7f7f7f7f
#define PII pair<int,int>

using namespace std;

int n,T; 


void ready()
{
	cin>>T;
}

void work()
{
	int a,b;
	cin>>a>>b;
	if(a>b) swap(a,b);
	if(a==1 && b==2) cout<<"Yes\n";
	else cout<<"No\n";
}

int main()
{
    ready();   
    while(T--)
      work();
    return 0;
}
  • 1
    点赞
  • 4
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值