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.csdn.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.csdn.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;
- }