F:找质数
一天蒜头君猜想,是不是所有的偶数(除了 22),都可以用两个质数相加得到呢?于是聪明的蒜头君就找你来验证了。
输入格式
第一行输入一个整数 tt 表示测试组数。
接下来 tt 行,每行一个整数 nn。
输出格式
输出两个整数,因为答案可能有多个,所有要求输出的这两个整数是所有答案中字典序最小的。
这个真鸡肋,居然卡输入输出。
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
bool visit[10100000];
int prime[10000000];
int num;
void init_prim()
{
int n=1000000;
memset(visit, true, sizeof(visit));
num = 0;
for (int i = 2; i *i<= n; ++i)
{
if (visit[i] == true)
{
num++;
prime[num] = i;
}
for (int j = 1; ((j <= num) && (i * prime[j] <= n)); ++j)
{
visit[i * prime[j]] = false;
if (i % prime[j] == 0) break;
}
}
}
int main(){
int t,n;
init_prim();
visit[1]=0;
visit[0]=0;
scanf("%d",&t);
while(t--){
cin>>n;
for(int i=1;i<=num;i++){
if(visit[prime[i]]&&visit[n-prime[i]]){
printf("%d %d\n",prime[i],n-prime[i]);
break;
}
}
}
return 0;
}
G:后缀字符串
一天蒜头君得到 nn 个字符串 sisi,每个字符串的长度都不超过 1010。
蒜头君在想,在这 nn 个字符串中,以 sisi 为后缀的字符串有多少个呢?
这道题利用map进行预处理查找(一开始没想到暴力超时了orz)
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
string s[100000+10];
map<string,int>mp;
int main(){
int n;
scanf("%d",&n);
for(int i=0;i<n;i++){
cin>>s[i];
}
mp.clear();
for(int i=0;i<n;i++){
for(int j=0;j<s[i].size();j++){
mp[s[i].substr(j)]++;
}
}
for(int i=0;i<n;i++){
printf("%d\n",mp[s[i]]);
}
return 0;
}
H:轻重搭配
n 个同学去动物园参观,原本每人都需要买一张门票,但售票处推出了一个优惠活动,一个体重为 xx 的人可以和体重至少为 2x2x 配对,这样两人只需买一张票。现在给出了 nn 个人的体重,请你计算他们最少需要买几张门票?
贪心,从中间位置开始查找
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
int a[1008611];
int main(){
int n;
cin>>n;
for(int i=0;i<n;i++){
cin>>a[i];
}
sort(a,a+n);
int mid=n/2-1;
int j=n-1;
int ans=0;
for(int i=mid;i>=0;i--){
if(a[j]<2*a[i]){
ans++;
}
else{
j--;
ans++;
}
}
if(j!=mid){
ans+=j-mid;
}
cout<<ans<<endl;
return 0;
}
I:抠图
dfs/bfs 搜索所有可达位置并标记
#include<iostream>
#include<cstdio>
#include<cmath>
#include<algorithm>
#include<map>
#include<string>
#include<cstring>
#include<set>
#include<queue>
#include<stack>
#define ll long long
#define inf 0x3f3f3f
using namespace std;
int d[4][2]={0,1,0,-1,1,0,-1,0};
int mp[505][505],vis[505][505];
int n,m;
void dfs(int x,int y){
for(int k=0;k<4;k++){
int dx=x+d[k][0];
int dy=y+d[k][1];
if(!vis[dx][dy]&&mp[dx][dy]&&dx>=0&&dx<n&&dy>=0&&dy<m){
vis[dx][dy]=1;
dfs(dx,dy);
}
}
}
int main(){
int t;
scanf("%d",&t);
while(t--){
memset(vis,0,sizeof(vis));
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
for(int j=0;j<m;j++){
scanf("%d",&mp[i][j]);
}
}
for(int i=0;i<n;i++){
if(!vis[i][0]&&mp[i][0]){
dfs(i,0);
}
if(!vis[i][m-1]&&mp[i][m-1]){
dfs(i,m-1);
}
}
for(int j=0;j<m;j++){
if(!vis[0][j]&&mp[0][j]){
dfs(0,j);
}
if(!vis[n-1][j]&&mp[n-1][j]){
dfs(n-1,j);
}
}
//dfs(0,0);
for(int i=0;i<n;i++){
for(int j=0;j<m-1;j++){
if(vis[i][j]){
printf("0 ");
}
else{
printf("%d ",mp[i][j]);
}
}
if(vis[i][m-1]){
printf("0\n");
}
else{
printf("%d\n",mp[i][m-1]);
}
}
}
return 0;
}