2013 长春网络赛 水题题解&反思
来源:互联网 发布:淘宝商品的详情页 编辑:程序博客网 时间:2024/05/16 09:59
下午刚做的题目,只会水题,按出题顺序写。
===========
06 Stone
题意:
给出N、K。首先A写一个在[1,K]之间的数X,然后B写下一个数Y,Y必须满足1<=Y-X<=K。然后X=Y,A再写一个数Y,同样必须满足1<=Y-X<=K。。。
谁写出的数字大于等于N,谁就输了。
做法:
很水的博弈。队友出的,1y。
#include <iostream>#include <cstdio>#include <cstring>#include <cmath>#include <algorithm>using namespace std;int main(){ int n,k; while(scanf("%d%d",&n,&k),n!=0||k!=0) { if((n-1)%(k+1)==0) { printf("Jiang\n"); } else printf("Tang\n"); } return 0;}
05 Theme Section
题意:
给出一个字符串,要求将其划分成五部分,即CACBC的形式,A、B的长度可以为0,求C最长能是多少。
做法:
利用KMP加速判断两个子串是否相等。
我是首先暴力枚举最长长度,判断串头串尾是否相等,相等再看能否在中间找到一个相同的子串。
本以为会tle,但数据太水,居然是1y。
反思:
对字符串、KMP不熟悉,没把握,不敢敲。等到很多人过了,才开始写。罚时无法直视。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;#define debug(x) cout<<#x<<":"<<x<<endl;const int N = 1e6 + 10;char s[N];int next[N];int len;void getNext(){ int i = 1, j = 0; next[1] = 0; while(i < len) { if(j == 0 || s[i] == s[j]) next[++i] = ++j; else j = next[j]; }}bool checkstr(int end,int cur){ if(end < cur) return false; if(!cur) return true; if(s[end] != s[cur] || next[end] < cur) return false; if(next[end] == cur) return true; return checkstr(next[end] - 1,cur - 1);}inline bool check(int cur){ if(!checkstr(len,cur)) return false; int midbegin = cur + cur; int midend = len - cur; for(int i = midbegin; i <= midend; i++) { if(checkstr(i,cur)) return true; } return false;}int main(){// freopen("in","r",stdin); int n; scanf("%d",&n); s[0] = ' '; while(n--) { scanf("%s",s + 1); len = strlen(s); len--; if(len < 3) { puts("0"); continue; } getNext(); int ret; for(ret = len / 3; ret > 0; ret--) { if(check(ret)) break; } printf("%d\n",ret); } return 0;}
题意:
N个草莓随即分配在一个环形蛋糕上,切成M块后,恰好所有草莓都在一块上的概率。
做法:
不懂原理。拿N/ ( (1/M)^(N-1) )来水一下,结果1y。
#include <iostream>#include <cstdlib>#include <cmath>#include <cstdio>#include <cstring>using namespace std;const int MAXN = 50;int a[MAXN],b[MAXN],c[MAXN];void mult(int a[],int b[],int c[]){ int ret[MAXN << 1]; int e = 0; memset(ret,0,sizeof(ret)); for(int i = 0; i < MAXN; i++) for(int j = 0; j < MAXN; j++) { ret[i + j] += a[i] * b[j] + e; if(ret[i + j] > 9) { e = ret[i + j] / 10; ret[i + j] %= 10; } else e = 0; } for(int i = 0; i < MAXN; i++) c[i] = ret[i];}void change(int n,int a[]){ memset(a,0,sizeof(int) * MAXN); int i = 0; while(n) { a[i] = n % 10; n /= 10; i++; }}void dis(int a[]){ int n = MAXN - 1; while(!a[n]&&n)n--; while(n >= 0)printf("%d",a[n--]); puts("");}int gcd(int a,int b){ if(!b)return a; return gcd(b,a % b);}int save[MAXN];int main(){ int t,n,m; int N; scanf("%d",&t); while(t--) { scanf("%d%d",&m,&n); N = n; for(int i = 1; i < N; i++) save[i] = m; for(int i = 1,tmp; i < N; i++) { tmp = gcd(n,save[i]); n /= tmp; save[i] /= tmp; if(tmp == 1 || n == 1) break; } printf("%d/",n); change(1,a); for(int i = 1; i < N; i++) { change(save[i],b); mult(a,b,a); } dis(a); } return 0;}
10 Flyer
题意:
有N个社团,分别会给编号为Ai + k * Ci (0 <= k && Ai + k * Ci <= Bi)的学生发一张传单。
最后至多只有一个学生的传单数量为奇数。
做法:
二分区间。
扫描所有社团,看在当前左区间的传单总数量是否为奇数,不是的话再统计右区间的。都不是的话说明不存在传单数量为奇数的学生。
奇数的话继续二分该区间。
#include <iostream>#include <cstdio>#include <cstring>using namespace std;typedef long long ll;#define RE(i,n) for(int i = 0; i < (n); i++)#define FLL "%I64d"#define debug(x) cout<<#x<<":"<<xconst int MAX = 20000 + 10;struct flyer { ll a,b,c,k;} f[MAX];int n;bool count(ll l,ll r) { bool odd = false; RE(i,n) { if(f[i].c == 0){ //f[i].c为0,必有f[i].a=f[i].b if(l <= f[i].a && f[i].a <=r) odd = !odd; continue; } if(l <= f[i].a && r >= f[i].b) { if(f[i].k & 1) odd = !odd; continue; } if(l > f[i].b || r < f[i].a) continue; int begin; if(l <= f[i].a) begin = f[i].a; else { ll tmp = l - f[i].a; if(tmp % f[i].c == 0) begin = l; else begin = (tmp / f[i].c + 1) * f[i].c + f[i].a; } int end = min(r,f[i].b); if(begin > end) continue; if(begin == end) { odd = !odd; continue; } int tmp = end - begin; tmp = tmp / f[i].c + 1; if(tmp & 1) odd = !odd; } return odd;}ll cnt(int x) { ll ret = 0; RE(i,n) if(x <= f[i].b && x >= f[i].a && (x - f[i].a) % f[i].c == 0) ret++; return ret;}int main() {// freopen("in.txt","r",stdin); while(~scanf("%d",&n)) { RE(i,n) scanf(FLL FLL FLL,&f[i].a,&f[i].b,&f[i].c); RE(i,n) if(f[i].c == 0) f[i].k = 1; else f[i].k = (f[i].b - f[i].a) / f[i].c + 1; ll low,mid, high; low = 1; high = 1LL << 31; bool odd = true; while(low <= high) { mid = (high + low) >> 1; if(count(low,mid)) high = mid; else if(count(mid + 1,high)) low = mid + 1; else { odd = false; break; } if(low == high) break; } if(!odd) puts("DC Qiang is unhappy."); else printf(FLL" "FLL"\n",low,cnt(low)); } return 0;}
=============
今天很神奇的都是1y。第一题出的也还算不太慢,对我们来说。
但是之后就一直在想题,不敢敲。
等过了一个多小时,同校的很多都过了2、3题了,才硬着头皮去搞字符串。
其实,思路挺清晰,就是对字符串、KMP没信心。
要找个时间做一些这方面的题。
至少就目前看来,想要A掉很少人过的题目,无疑是不太可能的。还是老实跟榜吧ORz
- 2013 长春网络赛 水题题解&反思
- 2013长春网络赛
- 2013icpc网络赛长春赛区J题(Flyer)
- 2013长春网络赛K题sword (hdu 4769)
- HDU 4765 Tsp 2013长春网络赛G题 DP
- HDU 4765 Tsp 2013长春网络赛G题 DP
- java大数(2013长春网络赛)--hdu4762
- 2013年ACM网络赛长春赛区
- 2013 长春网络赛 1005 Theme Section
- 2013长春网络赛 1006 Stone
- 2013长春网络赛 1010 Flyer
- HDU 4763 2013长春网络赛 KMP
- hdu5437(2015长春网络赛A题)
- hdu5438(2015长春网络赛B题)
- hdu5443(2015长春网络赛G题)
- hdu5444(2015长春网络赛H题)
- hdu5441(2015长春网络赛E题)
- hdu5446(2015长春网络赛J题)
- 贝叶斯及其部分应用
- 基础算法荟萃目录
- usaco_1.4.3
- 哈夫曼编码(备忘)
- 编译程序与操作系统的关系
- 2013 长春网络赛 水题题解&反思
- HDU 4767 Bell (中国剩余定理)
- 重要的伪文件系统/proc
- 点击Android系统back键
- HDU 4768 Flyer 二分
- 2014雅虎笔试题之矩阵中查找字符串
- C#手动加载类库和释放类库的代码
- 2014百度笔试现场突发奇想(就收购搜狗来说)
- hdu 4768 Flyer 思路+二分