20/32····这次周赛还是大部分没有算法。。也让我发现了自己思维的不足。。估计是刷题刷的太少了吧。
A题很快就出了,去做B题,觉得是贪心,,但是感觉还是想法出了点问题,应该要从大的开始取。。我变成从小的开始取,,搞了半天一直错,快崩溃了。
这时候发现好多人出了D,我就跑去看D,感觉就是难度不算大,但是要避免超时,我一开始直接遍历就妥妥的超时了,本来想写二分,奈何二分写的少,不是太会写,后来改成从中间向两边进行查询,就没事了。。后来听大一学长讲解之后,STL里面有自带的二分查找。。回去学习了一下。。确实比较好用。。
A了D之后,赶快回去写B,测了几组数据发现之前的从小开始取好像有点问题,然后从大开始取。。。赶快改啊啊啊啊啊啊。。。改完交了还是WA,觉得不科学。。仔细看了下代码,发现有一处地方。。s[0]写成s[n-1]没有改回来。。这时候还剩十分钟,怀着激动的心情交了终于过了orzzzzzzzzz 然后就等于结束了吧 10分钟开不了一题了。。。
A代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define M 1009
#define INF 0x3fffffff
using namespace std;
int isnot_prime(int a)
{
for(int i = 2;i*i <= a;i++)
{
if(a%i==0) return 1;
}
return 0;
}
int main ()
{
int n;
scanf("%d",&n);
for(int i = 2;i < n;i++)
{
if(isnot_prime(i)&&isnot_prime(n-i))
{
printf("%d %d\n",i,n-i);
break;
}
}
return 0;
}
B题代码:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define M 2009
#define INF 0x3fffffff
using namespace std;
int s[M];
int cmp(int a,int b)
{
return a > b;
}
int main ()
{
int n,k;
int ans = 0;
scanf("%d %d",&n,&k);
for(int i = 0;i < n;i++)
scanf("%d",&s[i]);
sort(s,s+n,cmp);
int m = 0;
//int i = 0;
int q = n-k;
if(q>0)
{
while(m<q) //第几个人
{
ans += 2*(s[m]-1);
m += k;
}
ans += 2*(s[m]-1);
printf("%d\n",ans);
}
else
printf("%d\n",2*(s[0]-1));
return 0;
}
D题一开始写的
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define M 1000500
#define INF 0x3fffffff
int s[M];
int mark[M];
struct state
{
int left,right;
}a[M];
using namespace std;
int main ()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d",&s[i]);
a[1].left = 1;
mark[a[1].left] = 1;
a[1].right = s[1];
mark[a[1].right] = 1;
for(int i = 2;i <= n;i++)
{
a[i].left = a[i-1].right+1;
mark[a[i].left] = i;
a[i].right = a[i-1].right+s[i];
mark[a[i].right] = i;
}
int m;
scanf("%d",&m);
for(int i = 0;i < m;i++)
{
int temp;
scanf("%d",&temp);
if(mark[temp]==0)
{
for(int j = temp;j<=1000000;j++)
{
if(mark[j]!=0)
{
printf("%d\n",mark[j]);
goto out;
}
}
for(int j = temp;j>=1;j--)
{
if(mark[j]!=0)
{
printf("%d\n",mark[j]);
goto out;
}
}
}
else
printf("%d\n",mark[temp]);
out:
;
}
return 0;
}
D题使用STL二分查找:
#include<iostream>
#include<cstdio>
#include<queue>
#include<cstring>
#include<algorithm>
#define M 1000500
#define INF 0x3fffffff
int s[M];
int a[M];
using namespace std;
int main ()
{
int n;
scanf("%d",&n);
for(int i = 1;i <= n;i++)
scanf("%d",&s[i]);
a[1]= 1;
a[2] = s[1];
for(int i = 3;i <= 2*n;i++)
{
if(i%2!=0)
a[i] = a[i-1]+1;
else
a[i] = a[i-2]+s[i/2];
}
int m;
scanf("%d",&m);
for(int i = 0;i < m;i++)
{
int temp;
scanf("%d",&temp);
int *iter = lower_bound(a, a+2*n,temp);
if((iter-a)%2==0)
printf("%d\n",(iter-a)/2);
else
printf("%d\n",(iter-a)/2+1);
}
return 0;
}