从http://qian-qi.com/archives/tag/oi下了省常中曹文信息竞赛培训的资料,
今天做了第一次的分班测试题,考得一塌糊涂,
选手 | bw | football | gus | nule | party | tel | tree | wild | 总分 | 名次
|
郑逸宁 | 50 | 0 | 100 | 0 | 50 | 10 | 0 | 50 | 260 | 33/74 |
差点被分到了普及组。。。
3个小时8题,主要看速度和准确性。
很显然没时间写对拍,还有考察对题目的选择。
在考试最后20分钟,除了放弃的tree外,还有比较麻烦的模拟football,和没想出来的DP nule,我选择了写nule的搜索,结果0分。。。
bw,小bug,没有检查,全场一半100.
gus,不说了,全场一半100.
party,树形DP,加上了统计方案是否唯一,没有仔细思考,写了层数为偶不唯一,层数为奇唯一(真是胡说八道!),50分。
tel,输入用字符串的,结果一行有1000+,挂了。。
wild,本来想出了DP,后来混乱了,改写搜索,50.
表示至少bw和tel还可以拿满分的,400就排十几名了。
江苏好强大。。。。
主要是代码还没有适应GUIDE的风格,写的比较慢,也没有出对拍(还不会写对拍呢。)
把题目写ac后再把代码发上来。
GUS:不解释
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 int main()
5 {
6 freopen("GUS.in","r",stdin);
7 freopen("GUS.out","w",stdout);
8 int n,m,count=0;
9 scanf("%d %d",&n,&m);
10 while(n&&m)
11 {
12 if(count&1)
13 m--;
14 else
15 n--;
16 count++;
17 }
18 printf("%d",count-1);
19 return 0;
20 }
21 Tel:改正输入后发现快排会超最后一个点,改成堆排
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 void down(int aa,int bb);
5 inline void change(int &a,int &b){a^=b;b^=a;a^=b;}
6 void up(int b);
7 int n;
8 char c[100000000];
9 int a[100001];
10 int to[27]={2,2,2,3,3,3,4,4,4,5,5,5,6,6,6,7,7,7,7,8,8,8,9,9,9,9};
11 void qsort(int low,int high);
12 int sort(int low,int high);
13 int main(){
14 freopen("tel.in","r",stdin);
15 freopen("tel.out","w",stdout);
16 char s[10001];
17 memset(a,0,sizeof(a));
18 scanf("%d ",&n);
19 for(int i=1;i<=n;i++){
20 memset(s,0,sizeof(s));
21 for(int j=0,k=0;s[j-1]!='\n';j++){
22 scanf("%c",&s[j]);
23 if(s[j]>='0'&&s[j]<='9'&&k<=6){
24 a[i]*=10;
25 a[i]+=(s[j]-'0');
26 k++;
27 }
28 else if(s[j]>='A'&&s[j]<='Y'&&k<=6){
29 a[i]*=10;
30 a[i]+=to[s[j]-'A'];
31 k++;
32 }
33 }
34 up(i);
35 }
36 for(int i=n;i>=2;i--){
37 change(a[1],a[i]);
38 down(1,i-1);
39 }
40 //qsort(1,n);
41 int k=1,t=1;
42 for(int i=1;i<=n;i++){
43 if(a[i]==a[i+1])
44 k++;
45 else
46 {
47 if(k>1){
48 printf("%d%d%d-%d%d%d%d %d\n",(a[i]/1000000)%10,(a[i]/100000)%10,( a[i]/10000)%10,(a[i]/1000)%10,(a[i]/100)%10,(a[i]/10)%10,a[i]%10,k);
49 t=0;
50 }
51 k=1;
52 }
53 }
54 if(t)
55 printf("No duplicates.");
56 return 0;
57 }
58 void down(int aa,int bb){
59 int x=a[aa],i=aa,j=aa*2;
60 while(j<=bb){
61 if(a[j]<a[j+1]&&j+1<=bb)
62 j++;
63 if(a[j]>x){
64 a[i]=a[j];
65 i=j;
66 j*=2;
67 }
68 else
69 break;
70 }
71 a[i]=x;
72 }
73 void up(int b){
74 int i=b,j=b/2,x=a[b];
75 while(j>=1){
76 if(a[j]<x){
77 a[i]=a[j];
78 i=j;
79 j>>=1;
80 }
81 else
82 break;
83 }
84 a[i]=x;
85 }
86 void qsort(int low,int high){
87 int t;
88 if(low<high){
89 t=sort(low,high);
90 qsort(low,t-1);
91 qsort(t+1,high);
92 }
93 }
94 int sort(int low,int high)
95 {
96 int t=a[low];
97 while(low<high){
98 while(low<high&&a[high]>=t)high--;
99 a[low]=a[high];
100 while(low<high&&a[low]<=t)low++;
101 a[high]=a[low];
102 }
103 a[low]=t;
104 return low;
105 }
106 wild:真的是搜索。。。int64。。。
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 char a[11];
5 long long b,t;
6 int count=0;
7 void dfs(int i,long long x);
8 int main(){
9 freopen("wild.in","r",stdin);
10 freopen("wild.out","w",stdout);
11 scanf("%s ",a);
12 scanf("%lld",&b);
13 t=strlen(a);
14 dfs(0,0);
15 printf("%d",count);
16 return 0;
17 }
18 void dfs(int i,long long x)
19 {
20 if(i==t){
21 if(x>b){
22 count++;
23 }
24 return ;
25 }
26 x*=10;
27 if(a[i]!='?'){
28 x+=(a[i]-'0');
29 dfs(i+1,x);
30 }
31 else
32 if(i)
33 for(int j=0;j<=9;j++)
34 dfs(i+1,x+j);
35 else
36 for(int j=1;j<=9;j++)
37 dfs(i+1,x+j);
38 }BW:对于k的理解错误。。。
1 #include<cstdio>
2 #include<cstring>
3 #include<iostream>
4 int main()
5 {
6 freopen("BW.in","r",stdin);
7 freopen("BW.out","w",stdout);
8 char s[27],a[27],t,ans[53];
9 int x;
10 int n,k;
11 scanf("%s",s);
12 scanf("%d",&k);
13 n=strlen(s);
14 for(int i=0;i<=n-1;i++)
15 a[i]=s[i];
16 for(int i=0;i<=n-1;i++)
17 for(int j=i+1;j<=n-1;j++)
18 if(a[i]>a[j])
19 {
20 t=a[i];
21 a[i]=a[j];
22 a[j]=t;
23 }
24 x=0;
25 for(int i=0;i<=n-1;i++)
26 {
27 ans[n-i-1]=s[x];
28 for(x=0;x<=n-1;x++)
29 if(a[x]==ans[n-i-1])
30 break;
31 }
32 for(int i=0;i<=n-1;i++)
33 if(s[k-1]==ans[i]){
34 x=i+1;
35 break;
36 }
37 for(int i=x;i<=n-1;i++)
38 printf("%c",ans[i]);
39 for(int i=0;i<=x-1;i++)
40 printf("%c",ans[i]);
41 return 0;
42 }