首页 > 代码库 > 2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码
2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码
Problem A: pigofzhou的巧克力棒
Description
Input
输入数据为T组(T <= 10000),每组数据读入一个n(n<=1000000000)
Output
一行一个整数代表能获得的最大高兴值
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=0
ps:关于这题 数学不好就真的只能找规律了。
首先 关于查找n!中k的因子是有数学公式的:
n!=n*(n-1)(n-2)……3*2*1
=(k*2k*3k…..*mk)*a a是不含因子k的数的乘积,显然m=n/k;
=(k^m)*(1*2*3…*m)*a
=k^m*m!*a
比如说例子代码:
int gs(int n,int k)
{
int num=0;
while(n)
{
num+=n/k;
n/=k;
}
return num;
}
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int T; 6 long long n,sum; 7 while(scanf("%d",&T)!=EOF) 8 { 9 while(T--) 10 { 11 sum=0; 12 scanf("%lld",&n); 13 while(n) 14 { 15 sum+=(n/2); 16 n/=2; 17 } 18 printf("%lld\n",sum); 19 } 20 } 21 return 0; 22 }
Problem B: Zhazhahe究竟有多二
Description
Zhazhahe竟然能二到把耳机扔到洗衣机里去洗,真的是二到了一种程度,现在我们需要判断一下zhazhahe二的程度(就是计算zhazhahe的脑残值有几个2的因子),下面给你一个n,n!表示zhazhahe的脑残值。
Input
输入一个正整数t(0<t<3000)表示样例组数,每组样例输入一个正整数n(0<n<1e18),n!表示zhazhahe的脑残值
Output
输出一个正整数表示zhazhahe二的程度
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=1
题解:思路和上一题基本上是一样的,代码几乎相同!不理解看上一题的题解!
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int T; 6 long long n,ans,i,sum; 7 while(scanf("%d",&T)!=EOF) 8 { 9 while(T--) 10 { 11 scanf("%lld",&n); 12 sum=0; 13 while(n) 14 { 15 n/=2; 16 sum+=n; 17 } 18 printf("%lld\n",sum); 19 } 20 } 21 return 0; 22 }
Problem C: 剁手女生节
Description
由于女生节准备到了,ming打算给班上女生送一份大礼。没错,就是数学练习册!
ming先前就已经收藏了 n 本练习册了,一直不舍得做,这次突然决定把它们都拿出来当作礼物送出去!
但是,ming班上一共有 4 个女生,为了不要显得自己偏爱哪一个,他觉得每个女生都应该分到同等数量的练习册。
这样的话,原来的 n 本就可能不太够了。于是他去逛亚马当商城。
他发现,最近ACM(Association of Counting Method)又出版了好多新版数学练习册:高数、线代、离散、概率论…
而且商店有三种促销优惠套餐:
第一种:任选 1 本练习册,送欧几里德主题套尺。只需 a 个比特币;
第二种:任选 2 本练习册,送莱布尼兹同款2B铅笔。只需 b 个比特币;
第三种:任选 3 本练习册,送爱因思坦专用橡皮擦。只需 c 个比特币。
那么问题来了:吃土ming如何用最少的比特币购买若干本练习册,使得全部(包括原来的n本)可以平分给四个女生?
Input
每组输入是一行四个整数:n,a,b,c(1 <= n,a,b,c <= 1e9)意思如题目描述。
Output
对每组输入,输出一行一个整数,表示ming要花的最少的比特币数。
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=2
思路:三种情况,讨论即可!给出两种写法:
1 #include <bits/stdc++.h> 2 #define ll long long int 3 using namespace std; 4 int main() 5 { 6 ll t; 7 scanf("%lld",&t); 8 while(t--) 9 { 10 ll n,a,b,c; 11 scanf("%lld%lld%lld%lld",&n,&a,&b,&c); 12 if(n%4==0) 13 printf("0\n"); 14 else 15 { 16 ll x=(4-(n%4)); 17 if(x==1)printf("%lld\n",min(min(a,c*3),c+b)); 18 if(x==2)printf("%lld\n",min(min(2*a,b),c*2)); 19 if(x==3)printf("%lld\n",min(min(3*a,a+b),c)); 20 } 21 } 22 return 0; 23 }
DP写法:
1 #include <bits/stdc++.h> 2 using namespace std; 3 long long dp[30]; 4 const long long inf=1<<30; 5 void init(int x) 6 { 7 for(int i=1;i<=24;i++) 8 dp[i]=i?inf:0; 9 } 10 int main() 11 { 12 int m[4]; 13 int T,n,x; 14 while(scanf("%d",&T)!=EOF) 15 { 16 while(T--) 17 { 18 scanf("%d",&n); 19 for(int i=1;i<=3;i++) 20 scanf("%d",&m[i]); 21 x=n%4; 22 if(!x) 23 cout<<0<<endl; 24 else 25 { 26 init(x); 27 for(int i=1;i<=12-x;i++) 28 for(int j=1;j<=3;j++) 29 if(i>=j) 30 dp[i]=min(dp[i],dp[i-j]+m[j]); 31 long long minx=inf; 32 for(int j=1;j<=3;j++) 33 minx=min(minx,dp[j*4-x]); 34 printf("%lld\n",minx); 35 } 36 } 37 } 38 return 0; 39 }
Problem D: 勤奋的涟漪2
Description
涟漪进入集训队后,他会去实验室训练或者去操场锻炼。 接下来n天,每天的情况是一下4种中的一种: 1.当天体育馆关门了和没有训练赛 2.当天体育馆关门了和有训练赛 3.当天体育馆开放和没有训练赛 4.当天体育馆开放和有训练赛 涟漪知道之后n天的情况。 涟漪每一天可以休息,或者打训练赛(当天有训练赛)或者运动(当天体育馆开放)。 涟漪要制定一个训练计划,决定每天干什么,但是涟漪不会连续两天都运动或者连续两天都打训练赛, 请帮涟漪找出她最少休息的天数(她不打训练赛和运动)。 休息的时候,她会做下面的数学题
Input
Output
输出 一个数 表示(涟漪休息的天数) 乘以(数学题的答案的积)。
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=3
分析:四次导数,结果为-24,注意这个好像没有什么了!
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 const int MAX=105; 4 int n,a[MAX]; 5 int main() 6 { 7 int T; 8 cin>>T; 9 while(T--) 10 { 11 scanf("%d",&n); 12 for(int i=1;i<=n;i++) scanf("%d",&a[i]); 13 int l=1; 14 while(a[l]==3) l++; 15 for(int i=l+1;i<=n;i++) 16 { 17 if(a[i]==3) 18 { 19 if(a[i-1]!=3) a[i]=3-a[i-1]; 20 } 21 else 22 { 23 if(a[i]==a[i-1]) a[i]=0; 24 } 25 } 26 int ans=0; 27 for(int i=1;i<=n;i++) 28 { 29 if(!a[i]) ans++; 30 } 31 cout<<ans*(-24)<<endl; 32 } 33 return 0; 34 }
Problem E: 穷游中国在统题
Description
Input
Output
Sample Input
Sample Output
1
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=4
思路:
1 #include<bits/stdc++.h> 2 using namespace std; 3 const int N=100000+10; 4 struct zxc 5 { 6 int xx,mm; 7 } a[N]; 8 bool cmp(struct zxc x,struct zxc y) 9 { 10 return x.mm<y.mm; 11 } 12 int main() 13 { 14 int t,c=0; 15 cin>>t; 16 while(t--) 17 { 18 int n,i,j; 19 cin>>n; 20 for(i=1; i<=n; i++) 21 { 22 a[i].xx=i;//记录原先所在的位置 23 cin>>a[i].mm; 24 } 25 stable_sort(a+1,a+n+1,cmp);//稳定排序 26 int tot=0; 27 i=1; 28 while(i<=n) 29 { 30 tot++; 31 int k=a[i].xx; 32 for(j=i; j<=k; j++)//相交的区间合并 33 if(a[j].xx>k) 34 k=a[j].xx; 35 i=k+1; 36 } 37 cout<<tot<<endl<<endl; 38 } 39 }
Problem F: 神偷TMK
Description
Input
Output
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=5
思路:这道题就不说了,输出ab!
下面给出AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 cout<<‘a‘<<‘b‘<<endl; 6 return 0; 7 }
Problem G: 神偷TMK后续
Description
Input
Output
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=6
思路:一个组合问题,求C(n,k);
下面给出AC代码:
1 #include<bits/stdc++.h> 2 using namespace std; 3 int main() 4 { 5 int n,k; 6 while(~scanf("%d%d",&n,&k)) 7 { 8 int a=1,b=1,c=1;//一定要赋值1; 9 for(int i=n;i>=1; i--) 10 a*=i; 11 for(int i=k; i>=1; i--) 12 b*=i; 13 for(int i=(n-k); i>=1; i--) 14 c*=i; 15 printf("%d\n",a/(b*c)); 16 } 17 return 0; 18 }
Problem H: 《为什么会变成这样呢》
Description
Input
Output
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=7
思路:
Single number 问题,其他数都出现了k(k>1)次,只有一个数出现了一次,求这个数。
考虑把出现了多次数消掉,如果k是偶数,则可用异或法;如果k是奇数,则可以用求和再求余法,出现k次的数模k为0,和里最终剩下的是那个single
number %k,还是不行,再利用一个性质,小于k的数对k取模就是这个数本身,分别求single number的每一位
1 #include <iostream> 2 #include <cstdio> 3 using namespace std; 4 unsigned long long FindFirstBitIs1 (long long num){ 5 long long indexBit = 0; 6 while ((num & 1) == 0 && indexBit < 32){ 7 num >>= 1; 8 ++indexBit; 9 } 10 return indexBit; 11 } 12 13 long long IsBit1 (long long data, unsigned long long indexof1){ 14 data >>= indexof1; 15 return data & 1; 16 } 17 18 void FindNumsAppearOnce (long long data[], long long n, long long &num1, long long &num2){ 19 long long result = 0; 20 long long i; 21 for (i=0; i<n; ++i){ 22 result ^= data[i]; 23 } 24 unsigned long long indexof1 = FindFirstBitIs1 (result); 25 num1 = 0; 26 num2 = 0; 27 for (i=0; i<n; ++i){ 28 if (IsBit1 (data[i], indexof1)) 29 num1 ^= data[i]; 30 else 31 num2 ^= data[i]; 32 } 33 } 34 35 int main(){ 36 int T; 37 cin>>T; 38 while(T--){ 39 long long num1 = 0,num2 = 0; 40 long long n; 41 scanf("%lld",&n); 42 long long *a=new long long[n]; 43 for(long long i=0;i<n;i++){ 44 scanf("%lld",&a[i]); 45 } 46 FindNumsAppearOnce(a,n,num1,num2); 47 printf("%lld %lld\n",min(num1,num2),max(num1,num2)); 48 delete[] a; 49 } 50 return 0; 51 }
Problem I: 只会做水题的jiakin
Description
听说ACM新生杯来了许多大佬,吓得只会做水题的jiakin开始做水题。 题目在一个n行m列二维网格中,位于右下角的格子。现在有若干种水管,类型及状态如下:
在网格中有一些格子布置着水管(只有一种类型一种状态),现在jiakin从最左上的格子开始灌水(即最左上的格子一直有水),且水只能沿水管向右或者向下流,问:jiakin能否成功做好水题。(如图:满足条件)
Input
第一行一个整数T(T < 10),代表T组测试数据。 每组数据第一行有两个整数n和m(n,m<=1000),表示网格的行数和列数。 接下去n行,每行有m个格式为(x,y)的一组数据,代表水管的类型和状态,其中(0,0)表示没水管。
Output
对每组数据第一行“Case x:”,x代表第x组数据。 第二行如果jiakin能成功水题则输出“Well done!”,否则输出“What a pity!”.
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=8
思路:只要理顺就好了!
下面给出AC代码:
1 #include <cstdio> 2 #include <iostream> 3 #include <climits> 4 #include <cstring> 5 6 using namespace std; 7 8 struct node{ 9 int x,y; 10 }g[1111][1111]; 11 12 bool f[1111][1111]; 13 14 int main(){ 15 freopen("input.txt","r",stdin); 16 int T,n,m; 17 scanf("%d\n",&T); 18 for(int cnt=1;cnt<=T;cnt++){ 19 scanf("%d %d\n",&n,&m); 20 for(int i=1;i<=n;i++){ 21 for(int j=1;j<=m;j++)scanf("(%d,%d)",&g[i][j].x,&g[i][j].y); 22 getchar(); 23 } 24 memset(f,0,sizeof f); 25 f[1][1]=1; 26 for(int i=1;i<=n;i++) 27 for(int j=1;j<=n;j++){ 28 if(i==1&&j==1) continue; 29 if(g[i][j].x==2&&g[i][j].y==4){ //2 4 30 f[i][j]=0; 31 continue; 32 } 33 if(g[i][j].x==2&&g[i][j].y==5){//2 5 34 f[i][j]=0; 35 continue; 36 } 37 38 if(g[i][j].x==2&&g[i][j].y==0&& 39 ((g[i][j-1].x==2&&g[i][j-1].y==3) 40 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 41 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 42 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 43 ||(g[i][j-1].x==4&&g[i][j-1].y==0))) f[i][j]=f[i][j-1]; //(2,0) 44 45 if(g[i][j].x==2&&g[i][j].y==1&& 46 ((g[i-1][j].x==2&&g[i-1][j].y==2) 47 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 48 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 49 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 50 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 51 ||(g[i-1][j].x==3&&g[i-1][j].y==3))) f[i][j]=f[i-1][j]; //(2,1) 52 53 if(g[i][j].x==2&&g[i][j].y==2&& 54 ((g[i][j-1].x==2&&g[i][j-1].y==3) 55 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 56 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 57 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 58 ||(g[i][j-1].x==4&&g[i][j-1].y==0))) f[i][j]=f[i][j-1]; //(2,2) 59 60 if(g[i][j].x==2&&g[i][j].y==3&& 61 ((g[i-1][j].x==2&&g[i-1][j].y==2) 62 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 63 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 64 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 65 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 66 ||(g[i-1][j].x==3&&g[i-1][j].y==3))) f[i][j]=f[i-1][j]; //(2,3) 67 68 if(g[i][j].x==3&&g[i][j].y==0&& 69 ((g[i][j-1].x==2&&g[i][j-1].y==3) 70 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 71 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 72 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 73 ||(g[i][j-1].x==4&&g[i][j-1].y==0))) f[i][j]=f[i][j-1]; //(3,0) 74 75 if(g[i][j].x==3&&g[i][j].y==3&& 76 ((g[i-1][j].x==2&&g[i-1][j].y==2) 77 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 78 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 79 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 80 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 81 ||(g[i-1][j].x==3&&g[i-1][j].y==3))) f[i][j]=f[i-1][j]; //(3,3) 82 83 if(g[i][j].x==3&&g[i][j].y==1){ 84 if((g[i-1][j].x==2&&g[i-1][j].y==2) 85 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 86 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 87 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 88 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 89 ||(g[i-1][j].x==3&&g[i-1][j].y==3)) f[i][j]=f[i-1][j]; 90 if(f[i][j]) continue; 91 if((g[i][j-1].x==2&&g[i][j-1].y==3) 92 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 93 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 94 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 95 ||(g[i][j-1].x==4&&g[i][j-1].y==0)) f[i][j]=f[i][j-1]; 96 } 97 if(g[i][j].x==3&&g[i][j].y==2){ 98 if((g[i-1][j].x==2&&g[i-1][j].y==2) 99 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 100 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 101 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 102 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 103 ||(g[i-1][j].x==3&&g[i-1][j].y==3)) f[i][j]=f[i-1][j]; 104 if(f[i][j]) continue; 105 if((g[i][j-1].x==2&&g[i][j-1].y==3) 106 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 107 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 108 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 109 ||(g[i][j-1].x==4&&g[i][j-1].y==0)) f[i][j]=f[i][j-1]; 110 } 111 if(g[i][j].x==4&&g[i][j].y==0){ 112 if((g[i-1][j].x==2&&g[i-1][j].y==2) 113 ||(g[i-1][j].x==3&&g[i-1][j].y==0) 114 ||(g[i-1][j].x==2&&g[i-1][j].y==1) 115 ||(g[i-1][j].x==3&&g[i-1][j].y==1) 116 ||(g[i-1][j].x==4&&g[i-1][j].y==0) 117 ||(g[i-1][j].x==3&&g[i-1][j].y==3)) f[i][j]=f[i-1][j]; 118 if(f[i][j]) continue; 119 if((g[i][j-1].x==2&&g[i][j-1].y==3) 120 ||(g[i][j-1].x==3&&g[i][j-1].y==0) 121 ||(g[i][j-1].x==3&&g[i][j-1].y==2) 122 ||(g[i][j-1].x==3&&g[i][j-1].y==3) 123 ||(g[i][j-1].x==4&&g[i][j-1].y==0)) f[i][j]=f[i][j-1]; 124 } 125 } 126 if(f[n][m]){ 127 printf("Case %d:\n",cnt); 128 puts("Well done!"); 129 } 130 else{ 131 printf("Case %d:\n",cnt); 132 puts("What a pity!"); 133 } 134 } 135 136 return 0; 137 }
Problem J: 质方数
Description
小z很喜欢研究各种各样的数字,最近他迷上了质数和平方数,他把一个质数的平方命名为”质方数”,现在他想知道,给出一个正整数,距离这个正整数最近的质方数是什么?(如果有2个距离相等的质方数,选择较小的一个)
Input
输入数据组数为T(T<=50),每组数据输入一个正整数n,其中1<=n<=100,000,000;
Output
对于每个测试样例,输出距离最近的质方数,每个样例占一行。
Sample Input
Sample Output
HINT
题目链接:http://gdutcode.sinaapp.com/problem.php?cid=1049&pid=9
思路:打表吧!之前也不知道懵了哪里,怎么都不会过,还有这道题很坑,官方数据都是有问题的!我只能膜拜出题君了!
下面给出AC代码:
1 #include <bits/stdc++.h> 2 using namespace std; 3 bool gcd(int n) 4 { 5 if(n==2) 6 return true; 7 else 8 { 9 for(int i=2;i<=sqrt((double)n);i++) 10 if(n%i==0) 11 return false; 12 } 13 return true; 14 } 15 int main() 16 { 17 int T,n; 18 while(scanf("%d",&T)!=EOF) 19 { 20 while(T--) 21 { 22 scanf("%d",&n); 23 int count1,count2; 24 int c; 25 if(n==0) 26 cout<<4<<endl; 27 if(n==1) 28 cout<<4<<endl; 29 else if(n>=2) 30 { 31 int x=n; 32 int y=n; 33 while(x--) 34 if(gcd(x)) 35 { 36 count1=n-x; 37 break; 38 } 39 while(y++) 40 if(gcd(y)) 41 { 42 count2=y-n; 43 break; 44 } 45 if(count1<=count2) 46 { 47 n=x; 48 c=count1; 49 } 50 else 51 { 52 n=y; 53 c=count2; 54 } 55 cout<<n*n<<endl; 56 } 57 } 58 } 59 return 0; 60 }
2016广东工业大学新生杯决赛网络同步赛暨全国新生邀请赛 题解&源码