cf掉分记,掉掉掉
又单挑了一场acm训练赛,偶然发现有一场时间很棒的cf,疲劳做题不可取啊,但还是抑制不住自己内心的欲望,打就打吧,大不了掉分,怕啥
A. Search for Pretty Integers
思路:找最小公共元素,若没有,则依次找各数组最小值,确实还是有点迟钝了,水题写了十几分钟
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
bool a[10],b[10],c[10];
int main()
{
int n,m;
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(a,false,sizeof(a));
memset(b,false,sizeof(b));
memset(c,false,sizeof(c));
for(int i=0;i<n;i++)
{
int temp;
scanf("%d",&temp);
a[temp] = true;
}
for(int i=0;i<m;i++)
{
int temp;
scanf("%d",&temp);
b[temp] = true;
if(a[temp])
{
c[temp] = true;
}
}
bool ok = false;
for(int i=1;i<=9;i++)
{
if(c[i])
{
printf("%d\n",i);
ok = true;
break;
}
}
if(!ok)
{
int aa,bb;
for(int i=1;i<=9;i++)
{
if(a[i])
{
aa = i;
break;
}
}
for(int i=1;i<=9;i++)
{
if(b[i])
{
bb = i;
break;
}
}
if(aa<bb)
{
int tempc = aa;
aa = bb;
bb = tempc;
}
printf("%d\n",aa+bb*10);
}
}
return 0;
}
B. Maximum of Maximums of Minimums
思路:这个签到题有点迟钝了,就分三种情况
m=1,求最小值
m=2,求边缘最大值
m>=3,求最大值
简单明了,连特殊情况都不用考虑
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
int a[maxn];
int main()
{
int n,k;
while(scanf("%d%d",&n,&k)!=EOF)
{
int maxa = -2e9;
int mina = 2e9;
for(int i=0;i<n;i++)
{
scanf("%d",&a[i]);
if(a[i] > maxa)
{
maxa = a[i];
}
if(a[i] < mina)
{
mina = a[i];
}
}
if(k>=3)
{
printf("%d\n",maxa);
}
else if(k==1)
{
printf("%d\n",mina);
}
else
{
printf("%d\n",max(a[0],a[n-1]));
}
}
return 0;
}
C. Maximum splitting
思路:这题一开始想了好久数论,后来发现数据量太大,并不能实现,还是太累了,都快写睡着了
算了还是老老实实素数筛找规律吧
至于合数的写法,搞了好久,其实各种写法都能实现,只是时间效率的问题,既然都是打表,就没啥了
最后由于数组越界WA了一发,终场前压哨交了一发,还好终审过了,惊心动魄,赶紧休息吧
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <cstring>
#include <map>
#include <cmath>
#include <string>
#include <queue>
#include <stack>
using namespace std;
const int maxn = 1e5+10;
bool visit[maxn];
vector <int> prime;//素数
vector <int> prime2;
vector <int> tempprime;
vector <int> nexprime;
void getPrime(int n)
{
memset(visit,false,sizeof(visit));
prime.clear();
for(int i=2;i<n;i++)
{
if(!visit[i])
{
prime.push_back(i);
}
for(int j=0;j<(int)(prime.size())&&i*prime[j]<n;j++)
{
visit[i*prime[j]] = true;
if(i%prime[j]==0)
{
break;
}
}
}
}
/*void getprime2(int n)
{
getPrime(n);
int len = prime.size();
//cout << len << endl;
prime2.clear();
for(int i=0;i<len;i++)
{
for(int j=0;prime[i]*prime[j]<=n;j++)
{
prime2.push_back(prime[i]*prime[j]);
}
}
}*/
void getprime2(int n)
{
getPrime(n);
int len = prime.size();
//cout << len << endl;
prime2.clear();
int pos = 0;
for(int i=4;i<=n;i++)
{
while(i>prime[pos]&&pos<len)
{
pos++;
}
if((i<prime[pos])||(pos==len))
{
prime2.push_back(i);
}
}
}
const int N = 500;
int re[N+10];
int main()
{
int q;
//freopen("standard.txt","w",stdout);
getprime2(N);
tempprime = prime2;
int len = prime2.size();
int slen = tempprime.size();
memset(re,-1,sizeof(re));
int num = 0;
while(slen)
{
num++;
for(int i=0;i<slen;i++)
{
if(re[tempprime[i]]<num)
{
re[tempprime[i]] = num;
}
}
nexprime.clear();
for(int i=0;i<len;i++)
{
for(int j=0;j<slen&&prime2[i]+tempprime[j]<=N;j++)
{
nexprime.push_back(prime2[i]+tempprime[j]);
}
}
tempprime = nexprime;
slen = tempprime.size();
}
/*for(int n=0;n<=200;n++)
{*/
for(int i=0;i<=N;i++)
{
cout << re[i] << endl;
}
/*while(scanf("%d",&q)!=EOF)
{
while(q--)
{
int n;
scanf("%d",&n);
if(n<=20)
{
printf("%d\n",re[n]);
}
else
{
int base = n/4;
if(n%2==1)
{
base--;
}
printf("%d\n",base);
}
}
}*/
return 0;
}
cf明天还有一场,估计那场打完,估计短时间内就不会再打了
ccsp,加油咯
文章地址:http://blog.youkuaiyun.com/owen_q/article/details/78245413