2013腾讯编程马拉松预赛第1场(3月21)(HDU 4505 HDU4506 HDU4507 HDU4508 HDU4509)
A题 (hdu 4505)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4505
解题思路: 水题没啥好说的,一般10分钟就能出来这道题。。。。1a
代码:
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int maxn = 20;
- int main()
- {
- int t, n, a[maxn];
- scanf("%d", &t);
- while (t--)
- {
- scanf("%d", &n);
- int i;
- for (i=0; i<n; i++)
- {
- scanf("%d", &a[i]);
- }
- sort(a, a+n);
- int ans = 0;
- int now = 0;
- for (i=0; i<n; i++, ans++)
- {
- if (a[i]<=now)continue;
- ans += 6 * (a[i] - now);
- ans += 5;
- now = a[i];
- }
- ans += now * 4;
- printf("%d\n", ans);
- }
- return 0;
- }
B题 (hdu 4506)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4506
解题思路: 这道题真晕。。我没做,最后发现其实我应该做这道题,不用啥技巧。。用了个快速幂。。。1a。。。
快速幂请参见:http://blog.****.net/liuqiyao_01/article/details/8478402
代码:
#include <iostream> using namespace std; const __int64 tmp = 1000000007; const int maxn = 10005; __int64 n, t, k, a[maxn]; __int64 qpow(int a, int b) { __int64 c, d; c = 1; d = a; while (b > 0) { if (b & 1) c *= d; c %= tmp; b = b >> 1; d = (d * d) % tmp; } return c % tmp; } int main() { int T; scanf("%d", &T); while (T--) { scanf("%I64d %I64d %I64d", &n, &t, &k); int i; __int64 multi = qpow(k,t); for (i=0; i<n; i++) { scanf("%I64d", &a[i]); a[i] = a[i] * multi % tmp; } t %= n; printf("%d", a[(n+0-t)%n]); for (i=1; i<n; i++) { printf(" %d", a[(n+i-t)%n]); } puts(""); } return 0; }
C题 (hdu 4507)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4507
解题思路:木有,据说是数位DP。。。
代码:无解啊有木有。。。据说这也只是regional 的初期题。。。。。
网上大牛代码~~ACM一群 [退队狗]cherudim 提供!
#include <cstdio> #include <algorithm> #include <cstdlib> #include <sstream> #include <iostream> #include <string> #include <cstring> #define sz(a) ((int)(a).size()) #define Rep(i,j,k) for (int i=(j); i<=(k); i++) using namespace std; typedef long long LL; const int MOD=(int)1e9+7; struct TT{ int sq, sum, num; } f[22][2][7][7][2]; TT ff(TT a, int b){ a.sq=(a.sq*100LL+20LL*a.sum*b+b*b*(LL)a.num)%MOD; a.sum=(a.sum*10LL+(LL)a.num*b)%MOD; return a; } void update(int &x, int y){ x+=y; if (x>=MOD) x-=MOD; } void update(TT & a, TT b){ update(a.sq,b.sq); update(a.sum,b.sum); update(a.num,b.num); } int doit(LL n){ if (n==0) return 0; memset(f,0,sizeof f); f[0][0][0][0][0].num=1; stringstream sss;sss<<n;string ss;sss>>ss; int m=sz(ss); Rep(i,0,m-1) Rep(con7,0,1) Rep(dig7,0,6) Rep(n7,0,6) Rep(same,0,1) Rep(p,0,9){ if (same==0 && p>ss[i]-'0') continue; int Ncon7=con7 || (p==7), Ndig7=(dig7+p)%7, Nn7=(n7*10+p)%7; int Nsame=same; if (same==0 && p<ss[i]-'0') Nsame=1; update(f[i+1][Ncon7][Ndig7][Nn7][Nsame],ff(f[i][con7][dig7][n7][same],p)); } int ans=0; Rep(con7,0,1) Rep(dig7,0,6) Rep(n7,0,6) Rep(same,0,1) if (!con7 && dig7 && n7) update(ans, f[m][con7][dig7][n7][same].sq); return ans; } int main(){ int T; cin>>T; while(T--){ LL L,R; cin>>L>>R; cout<<(doit(R)-doit(L-1)+MOD)%MOD<<endl; } return 0; }
这里还有另一个大牛的(转自:http://blog.****.net/acm_cxlove/article/details/8707084)
#include<cstdio> #include<cstring> #include<algorithm> #include<vector> #include<cmath> #include<iostream> #define LL long long #define MOD 1000000007 #define mp(a,b) make_pair(a,b) using namespace std; //长度,是否有7,数字和%7,数字%7 LL s1[20][2][7][7],s2[20][2][7][7],cnt[20][2][7][7]; int bit[20],len; LL fac[20]={1}; pair<pair<int,int>,int> dfs(int len,int a,int b,int c,int limit){ if(cnt[len][a][b][c]!=-1&&!limit) return mp(mp(cnt[len][a][b][c],s1[len][a][b][c]),s2[len][a][b][c]); if(!len){ if(!a&&b&&c) cnt[len][a][b][c]=0LL; else cnt[len][a][b][c]=1LL; s1[len][a][b][c]=s2[len][a][b][c]=0LL; return mp(mp(cnt[len][a][b][c],s1[len][a][b][c]),s2[len][a][b][c]); } int up=limit?bit[len]:9; LL tcnt=0LL,ts1=0LL,ts2=0LL; for(int i=0;i<=up;i++){ int nl=len-1,na=(a||i==7),nb=(b+i)%7,nc=(c*10+i)%7; LL f=(fac[len-1]*i)%MOD; pair<pair<int,int>,int> pre=dfs(nl,na,nb,nc,limit&&(i==up)); ts1=(ts1+pre.first.second+pre.first.first*f)%MOD; ts2=(ts2+pre.second+(f*f%MOD)*pre.first.first+2*f*pre.first.second)%MOD; tcnt=(tcnt+pre.first.first)%MOD; } if(!limit){ cnt[len][a][b][c]=tcnt; s1[len][a][b][c]=ts1; s2[len][a][b][c]=ts2; } return mp(mp(tcnt,ts1),ts2); } LL sum(LL n){ LL a=n,b=n+1,c=2*n+1; int x=3,y=2; if(a%x==0) a/=x,x=1;if(a%y==0) a/=y,y=1; if(b%x==0) b/=x,x=1;if(b%y==0) b/=y,y=1; if(c%x==0) c/=x,x=1;if(c%y==0) c/=y,y=1; a%=MOD;b%=MOD;c%=MOD; return (a*b%MOD)*c%MOD; } LL slove(LL n){ len=0; LL m=n; while(n){ bit[++len]=n%10; n/=10; } return (sum(m)-dfs(len,0,0,0,1).second)%MOD; } int main(){ for(int i=1;i<20;i++) fac[i]=(fac[i-1]*10)%MOD; int t; LL l,r; memset(cnt,-1,sizeof(cnt)); scanf("%d",&t); while(t--){ scanf("%I64d%I64d",&l,&r); //cout<<slove(r)<<" "<<slove(l-1)<<endl; printf("%I64d\n",((slove(r)-slove(l-1))%MOD+MOD)%MOD); } return 0; }
D题 (hdu 4508)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4508
解题思路: 0-1背包的模版题,不一定要把背包装满,调试的时候数组开小RE3次、。。。。。太粗心了。。。。
代码:
- #include <iostream>
- using namespace std;
- #define max(a,b) ((a)>(b)?(a):(b))
- const int maxn = 105;
- int main()
- {
- int n, m;
- int a[maxn], b[maxn], dp[100005];
- while (scanf("%d", &n) != EOF)
- {
- int i, j;
- for (i=1; i<=n; i++)
- scanf("%d %d", &a[i], &b[i]);
- scanf("%d", &m);
- memset(dp, 0, sizeof(dp));
- for (i=1; i<=n; i++)
- {
- for (j=0; j<=m; j++)
- {
- if (b[i] > j) continue;
- dp[j] = max(dp[j], dp[j-b[i]] + a[i]);
- }
- }
- printf("%d\n", dp[m]);
- }
- return 0;
- }
E题(hdu 4509)
题目链接: http://acm.hdu.edu.cn/showproblem.php?pid=4509
解题思路: 一开始xindoo和我说穷举。。我一看输入量,觉得穷举肯定没戏,但是想不出别的方法,于是穷举,思路乱七八糟的wa了3次。。郁闷啊。。直到他们出了这道题,我就没做。。22号看网上大牛用memset,很好用。。。第一次学。。以后一定能用上。
代码:
- #include <iostream>
- #include <algorithm>
- using namespace std;
- const int maxn = 500005;
- int n;
- int main()
- {
- int flag[1440];
- while (scanf("%d", &n) != EOF)
- {
- int sh, sm, eh, em;
- memset(flag, -1, sizeof(flag));
- int i;
- int ans = 0;
- for (i=0; i<n; i++)
- {
- scanf("%d:%d %d:%d", &sh, &sm, &eh, &em);
- int s = sh * 60 + sm;
- int e = eh * 60 + em;
- memset(flag + s, 0, (e-s)*sizeof(flag[0]));
- }
- for (i=0; i<1440; i++)
- if (flag[i])
- ans++;
- printf("%d\n", ans);
- }
- return 0;
- }
- 1楼xindoo3天前 12:43
- 你的E题太暴力了,看我的代码,耗时耗内存都少,而且代码短。nn[code=cpp]n#include <cstdio>n#include <cstring>nint s[1445];nint main()n{n int n;n while (scanf("%d",&n) != EOF)n {n memset(s,0,sizeof(s));n int a,b,c,d;n while (n--)n {n scanf("%d:%d %d:%d",&a,&b,&c,&d);n s[a*60+b] += 1;n s[c*60+d] -= 1;n }n int ans = 0;n int ss = 0;n for (int i = 0;i < 1440;i++)n {n ss += s[i];n if (!ss)n ans++;n }n printf("%d\n",ans);n }n}n[/code]
- Re: liuqiyao_013天前 13:10
- 回复xindoon不暴力非man