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; }
#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; }
#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; }
#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; }