2016年第四届湘潭大学新生趣味程序设计竞赛
Age |
||
Accepted : 935 | Submit : 2435 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Age题目描述今年是2016年,一个年龄小于99岁(出生当年为0岁)的人,把出生年份的前两位和后两位相加得到一个整数n 。你能根据n,算出他有多少岁吗? 输入第一行输入一个整数T(1≤T≤99) ,表示样例的个数。每行输入一个整数n 。 输出每行输出一个样例的结果。 样例输入2 20 118 样例输出16 17 样例解释第1样例,此人生于2000年;第2样例,此人生于1999年。 |
解法:确定首末的时间,循环遍历就行
#include<bits/stdc++.h> using namespace std; #define ll long long #define MAX_N 1000000 int main() { int t; int num; cin>>t; while(t--) { cin>>num; for(int i=1918; i<=2016; i++) { //cout<<i/100<<" "<<i%100<<endl; int x=i/100; int y=i%100; if(x+y==num) { cout<<2016-i<<endl; break; } } } return 0; }
|
Balance |
||
Accepted : 198 | Submit : 993 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Balance题目描述小明有一架天平,小明想称出1∼n 克的物品,请问最少需要几颗砝码?
输入第一行是一个整数T(1≤T≤10000) ,表示样例的个数。以后每行一个样例,为一个整数 (1≤n≤10^9 )。 输出每行输出一个样例的结果。 样例输入3 1 4 40 样例输出1 2 4 |
解法:结论题
#include<stdio.h> //#include<bits/stdc++.h> #include<string.h> #include<iostream> #include<math.h> #include<sstream> #include<set> #include<queue> #include<map> #include<vector> #include<algorithm> #include<limits.h> #define inf 0x7fffffff #define INFL 0x7fffffffffffffff #define lson l,m,rt<<1 #define rson m+1,r,rt<<1|1 #define LL long long #define ULL unsigned long long using namespace std; long long pow4(long a,long b) { long long r=1,base=a; while(b!=0) { if(b&1) r*=base; base*=base; b>>=1; } return r; } int main() { int t; cin>>t; while(t--) { int n; int i=0; cin>>n; long long sum=0; while(sum<n) { sum+=pow4(3,i); i++; } cout<<i<<endl; } return 0; }
Clock |
||
Accepted : 353 | Submit : 2181 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Clock题目描述钟的一圈是12小时,其中时针、分钟都是匀速移动。一天从00:00~23:59,请问某一时刻,时针与分针的夹角是多少?
输入第一行是一个整数T(1≤T≤1440) ,表示样例的个数。以后每行是一个时刻,格式为HH:MM。 输出每行输出一个样例的结果,如果结果不是整数,小数部分不要输出多余的0。 样例输入2 00:01 00:30 样例输出5.5 165 |
解法:注意是24小时制,其他公式计算,字符串处理去0
#include<bits/stdc++.h> using namespace std; map<int,int>q; double h,m; int main() { int t; cin>>t; while(t--) { char s[100000]; scanf("%lf:%lf",&h,&m); if(h>=12) { h-=12; } double ant=abs((h*30+m*0.5)-m*6); // cout<<ant<<endl; if(ant>180) { string ss=""; double sum=abs(ant-360); sprintf(s,"%f",sum); int i; for(i=strlen(s)-1; i>=0; i--) { if(s[i]!='0') { // cout<<i<<endl; break; } } if(s[i]!='.') { for(int j=0; j<=i; j++) { ss+=s[j]; } cout<<ss<<endl; // cout<<"A"<<endl; } else { for(int j=0; j<i; j++) { ss+=s[j]; } cout<<ss<<endl; } } else { string ss=""; sprintf(s,"%f",ant); int i; for(i=strlen(s)-1; i>=0; i--) { if(s[i]!='0') { // cout<<i<<endl; break; } } if(s[i]!='.') { for(int j=0; j<=i; j++) { ss+=s[j]; } cout<<ss<<endl; } else { for(int j=0; j<i; j++) { ss+=s[j]; } cout<<ss<<endl; } } } return 0; }
Different Digits |
||
Accepted : 211 | Submit : 1028 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Different Digits题目描述有一个n 位数x ,每个数码都不一样,可你知道x 的后m(m<n) 位构成的整数x′ ,请问满足条件最小的x 是多少? 输入第一行是一个整数T(1≤T≤1000) ,表示样例的个数。 每个样例一行,为两个整数n(2≤n≤10) 和x 的后m 位的整数x′(0≤x′<987654321,x′没有前导0且所有数码都不一样) 。 输出每行输出一个样例的结果。 样例输入2 3 12 4 12 样例输出312 3012 |
解法:长度只有10,所以,暴力就行
#include<bits/stdc++.h> using namespace std; string s,ss; int n,m; map<char,int>q; int main() { int t; cin>>t; while(t--) { ss=""; q.clear(); cin>>n>>s; if(n==s.length()) { cout<<s<<endl; } else { for(int i=0; i<s.length(); i++) { q[s[i]]=1; } for(char x='1'; x<='9'; x++) { // cout<<x<<endl; if(q[x]==0) { ss+=x; q[x]=1; break; } } // cout<<ss<<endl; for(char x='0'; x<='9'; x++) { if(ss.length()==n-s.length()) { break; }// cout<<x<<endl; if(q[x]==0) { ss+=x; q[x]=1; // break; } } cout<<ss+s<<endl; } } return 0; }
Estrella's Travel |
||
Accepted : 103 | Submit : 262 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Estrella's Travel题目描述Estrella喜欢旅行,她准备去自己心仪的城市看风景。她精心选择了一条线路,准备自驾游。自驾线路是一条链路,上有n+1 座城市,编号依次为0∼n ,Estrella住在0 号城市,目的地是n 号城市。Estrella为了环保,驾驶了一辆纯电动车,所以最多只能一次行驶m 个城市的距离。如果Estrella在某个城市(包括n 号城市)停留,自然会需要一些费用,当然每个城市的花费是不一样,Estrella想知道,这个花费最小是多少? 输入多组数据输入。 输出对于每个数据,输出一行,表示总的花费。 样例输入5 2 1 2 3 4 5 6 2 6 5 4 3 2 1 样例输出9 9 样例解释第1个样例,依次到城市1,3,5,所以花费为1+3+5=9; 解法:因为是最多走m个距离,所以暴力保存1-m距离取最小值就行,然后处理 #include<bits/stdc++.h> using namespace std; int x[100000],y[100000]; int sum[100000+100000]; int n,m; int main() { while(~scanf("%d%d",&n,&m)) { memset(sum,0,sizeof(sum)); for(int i=1;i<=n;i++) { cin>>x[i]; } for(int i=0;i<m;i++) { sum[n+i]=x[n]; } for(int i = n; i >= 0; i--) { int Min =(1<<31)-1; for(int j = 1; j <= m; j++) { Min=min(Min,sum[i+j]+x[i]); } sum[i]=Min; } printf("%d\n",sum[0]); } return 0; }
|
Finally,Which light is on? |
||
Accepted : 229 | Submit : 1043 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Finally, which light is on?题目描述有n盏灯,编号1~n。一开始灯都是关着的,每个灯有一个开关,按奇数次为打开,按偶数次为关闭。我们先把编号为1的倍数的灯按一下开关,再把编号为2的倍数的灯按一下开关,依次下去,一直到把编号为n的倍数灯按一下,请问最后有多少盏灯是亮的?
输入第一行是一个整数T(1≤T≤10000) ,表示样例的个数。以后的每行一个样例,为一个整数n(1≤n≤10^9) 。 输出每行输出一个样例的结果。 样例输入2 1 5 样例输出1 2 样例解释第2个样例,先把1~5都打开;然后把2,4关掉;然后把3关掉;然后把4打开;然后把5关掉;所以,最后剩1和4是亮着的。 |
#include<bits/stdc++.h> using namespace std; map<int,int>q; double h,m; int main() { int t; cin>>t; while(t--) { int num; cin>>num; printf("%d\n",(int)sqrt(num)); // cout<<<<endl; } return 0; }
Gemstone Bracelet |
||
Accepted : 210 | Submit : 754 | |
Time Limit : 1000 MS | Memory Limit : 65536 KB |
Gemstone Bracelet题目描述mumuchacha是一个爱美的小姑娘,她有一条漂亮的宝石手链,宝石手链上有N个不同的宝石,每一颗宝石都有它特定的魅力值。 mumuchacha每天都把手链戴在手上,她很喜欢抬起手来看她的手链,但是每次都只能看到一部分(M个宝石),因为还有一部分被手臂挡住了,所以她不断的旋转手链,每次转动一颗宝石,使每次看到的宝石都不同,求mumuchacha每次旋转后看到的宝石魅力值之和的最大值。 输入有多个样例,输入的第一行是样例个数T 输出每行输出一个整数,即魅力值和的最大值 样例输入2 5 3 1 2 3 4 5 10 4 6 7 4 5 8 4 2 5 9 4 样例输出12 26 |
解法:保存前缀和,依次处理就好,(记住是成一种环,所以需要再增加原来数组的长度)
#include<bits/stdc++.h> using namespace std; long long a[1000010]; long long sum[1000010]; long long x=-1; int main() { int t; cin>>t; while(t--) { memset(sum,0,sizeof(sum)); x=-1; sum[0]=0; long long num; long long n,m; cin>>n>>m; for(int i=1; i<=n; i++) { cin>>a[i]; sum[i]+=(sum[i-1]+a[i]); // cout<<sum[i]<<endl; } for(int i=1; i<=n; i++) { sum[i+n]+=(sum[i+n-1]+a[i]); // cout<<sum[i]<<endl; } x=max(x,sum[m]); for(int i=m+1; i<=n+n; i++) { // cout<<sum[i]-sum[i-m]<<endl; x=max(x,sum[i]-sum[i-m]); // cout<<sum[i]-sum[i-m]<<endl; } cout<<x<<endl; } return 0; }