这次比赛原本就是来打酱油的,想做个签到题就走!一开始不知道1002是签到题,一直死磕1001,WA了四发过了,回头一看Rank,三十名,我靠!看了1001的AC率,在我AC之前只有一个人AC了,当时我AC了1001,感觉松了口气,终于算是签到了,看AC率,1%,吓死宝宝了!我啥时候变得这么屌了,连我们学校的大佬都没AC出来,被我这样一个菜鸡给AC了,顿时感觉信心回来了,然后我的电脑上插了一个气球,莫名其妙,还有气球???回头看1002,我靠,WA了三发,什么情况,10^9,肯定超时,WA了一发,原本想什么快速幂弄出来,我真是傻了眼,又WA了两发,我静下心来想想,人家最快27秒AC,不可能很复杂,结果再读了一遍题目,被坑啦!就总共两种情况,n=0和n!=0的情况,然后AC了!Rank 15~~,然后1005我就不说了,估计是没有想清楚,WA了5发,最后Rank 21结束,没办法咯!好好学吧!为了自己的未来,加油!
1001--------------------------------------------------------------------------------------------------------------------------
三种橙子
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 201 Accepted Submission(s) : 7
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
Output
Sample Input
5 4 3
1 1 1
2 3 3
Sample Output
4
1
2 对于第一组数据 我们可以划分为
gbb
rgg
brr
rrg
g表示绿苹果,r表示红苹果,b表示青苹果
Author
#include <bits/stdc++.h>
using namespace std;
int main()
{
long long a,b,c;
while(scanf("%lld%lld%lld",&a,&b,&c)!=EOF)
{
long long s=a+b+c;
long long x,y,z;
if(a>=b)
{
if(a>=c)
{
x=a;
if(b>=c)
y=c;
else y=b;
}
else x=c;
}
else
{
if(a>=c)
x=b;
else
{
y=a;
if(b>=c)
x=b;
else x=c;
}
}
z=s-x-y;
long long t=s/;
if (y+z<=x&&s>=)
{
if(y+z<=t)
printf("%lld\n",y+z);
else printf("%lld\n",t);
}
else
printf("%lld\n",s/);
}
return ;
}
1002-------------------------------------------------------------------------------------------------------------
会喊666的咸鱼
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 277 Accepted Submission(s) : 53
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
Output
Sample Input
1
Sample Output
6
Author
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
while(scanf("%d",&n)!=EOF)
{
if(n==)
printf("1\n");
else if(n>=)
printf("6\n");
}
return ;
}
1003--------------------------------------------------------------------------------------------------------------------
学妹的告白
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 69 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
太过直白反而会吓着学长,学妹心里是这么想的,于是她想了一个游戏。
学长,我们玩一个游戏吧,“游戏?”学长满脸疑问看着她。
哎呀,是这种的,我们现在纸上画一个方框,平均分成n份,编号为1~n,然后呢,我们从1号开始移动k个数字,如果遇上边界就改变方向,就是下面的样子,比如8个格子,移动两个数字(图片不能正常显示请点击:链接http://pan.baidu.com/s/1eR7AHCQ)
1->3->5->7->7->5->3->1->3....如果这样一直跳,就会出现死循环,不能把每一个格子都踩中,那么我们需要最小的k是多少时才能满足每一个格子都踩中呢?
“那不是等于1么”学长脱口而出~
这样就没法玩了,难怪都这么久都没有女朋友,当然k不能等于1!
“那我再想一想”,刚说完,学长就得到了答案,学妹失望的走了。
“奇怪,明明答案是正确的啊,怎么不开心呢?”(真实的故事)
Input
(多组输入)
Output
k不等于1
Sample Input
8
Sample Output
3 1->4->7->6->3->2->5->8 全部踩中
Author
int flag[N];
int check(int x,int n)
{
for(int i=;i<=n;i++)
flag[i]=;
int ans=;
int st=;
int dir=;
while(ans<n-)
{
if(dir)
st+=x;
else
st-=x;
if(st<=)
st=-st,dir=;
else if(st>n)
st=*n-st,dir=;
//cout<<x<<" xxx "<<st<<endl;
int p=st;
if(flag[p])return ;
ans++;
flag[p]=;
}
return ;
}
下面给出AC代码:
#include <iostream>
#include <cstdio>
#include <cmath>
#include <string>
#include <cstring>
#include <algorithm>
#include <queue>
#include <map>
#include <set>
#include <stack>
#include <sstream>
#include <vector>
#define PI acos(-1.0)
#define N 111111
#define M 1000000007
#define inf 1e9
#define eps 1e-8
#define dazhi 2147483647
using namespace std;
typedef long long ll;
int main()
{
int a[]= {,,,,,,,};
int n;
while(cin>>n)
{
int l=;
for(int i=; i<; i++)
{
if(n%l==)
l*=a[i+];
else
{
printf("%d\n",a[i]);
break;
}
}
}
}
方案二,
如果做过HDU1222题估计会好很多,结论就是gcd(2*n-2,k)==1时,所有格子可以踩中
HDU1222是一个圈啦,这里不是,我们要看成一个圈,比如12321,我们取1232为循环,就是2*3-2(2*n-2)
下面给出AC代码:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <math.h>
#include <iostream> // C++头文件,C++完全兼容C
#include <algorithm> // C++头文件,C++完全兼容C
#include <time.h>
#define fre freopen("out.txt","w",stdout) //以文件代替控制台输入,比赛时很常用,能缩短输入测试样例的时间
#define INF 0x3f3f3f3f
#define inf 1e60
using namespace std; // C++头文件,C++完全兼容C
const int maxn = ;
int a[maxn];
int b[];
int ans,n,k; int main()
{
while(cin>>n)
{
for(int i=; i<=*n; i++)
{
if(__gcd(*n-,i)==)
{
cout<<i<<endl;
break;
}
}
} return ;
}
1004--------------------------------------------------------------------------------------------------------------------------------
豆豆的三进制计算机
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 31 Accepted Submission(s) : 2
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
三进制是以3为基数的进制。和二进制一样,三进制的数位,称为三进制位(trit),每个三进制位包含 log23(约1.58个)二进制位的信息量。通常,三进制中使用0、1、2三个数字。
n!末尾有多少个0这样的问题对于豆豆来说是非常简单的。豆豆突然想到那么n!转换成3进制后,末尾有多少个0呢?
Input
(多组数据)
Output
Sample Input
3
Sample Output
1
Author
Source
我们想一想十进制怎么求末尾0,嗯嗯,当然是找被10整除的个数喽
这里情况一样的啦,我们就一直除以3,一直除以3,找被3整除的个数
下面给出AC代码:
#include <stdio.h>
#define freout freopen("out.txt","w",stdout)
#define frein freopen("in.txt","r",stdin)
int main ()
{
// frein;
// freout;
long long n;
while(~scanf("%lld", &n))
{
long long sum = ;
long long tmp = ;
while (n >= tmp)
{
sum += (n / tmp);
tmp *= ;
}
printf("%lld\n", sum);
} return ;
}
1005--------------------------------------------------------------------------------------------------------------------------
袁少的游戏
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 200 Accepted Submission(s) : 24
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
Input
然后输入n个数。(多组输入)
Output
Sample Input
5
1 3 3 2 1
5
1 2 3 4 5
2
1 2
Sample Output
jxust
ecjtujxnu
jxust 第一组样例可以通过所有的3都减一,所有的1都加一,使全部都变成2.所以输出jxust
第三组样例可以让1加上1,使所有数都变成2,或者让2减去1,使所有数都变成1,所以输出jxust
Author
大概知道了如果数组中只存在两种数字,必定是符合要求的
三种如何判断,最小的数字必须增加一个数,最大的数字必须减少一个数字,他们要和中间数字相同,那么是a[3]-a[2]==a[2]-a[1]的关系
我们需要做的就是去重计算出他的种类,排序判断
下面给出AC代码:
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
#define bug(x) cout<<"bug"<<x<<endl;
const int N=1e5+,M=1e6+,inf=;
const ll INF=1e18+,mod=;
ll a[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=; i<=n; i++)
scanf("%lld",&a[i]);
sort(a+,a++n);
int cnt=unique(a+,a++n)-a;
//cout<<cnt<<endl;
if(cnt>)
printf("ecjtujxnu\n");
else
{
if(cnt<=)
printf("jxust\n");
else if(a[]-a[]==a[]-a[])
printf("jxust\n");
else
printf("ecjtujxnu\n");
}
}
return ;
}
1006---------------------------------------------------------------------------------------------------------------------------------
来相思树下
Time Limit : 3000/1000ms (Java/Other) Memory Limit : 65535/32768K (Java/Other)
Total Submission(s) : 32 Accepted Submission(s) : 0
Font: Times New Roman | Verdana | Georgia
Font Size: ← →
Problem Description
虽然都是妖王,但按照涂山的规定必须进行标号,标号为1的妖王排在最后面,标号为n的妖王排在最前面。每个妖王只有一个妖力值a[i]表示它们现在的地位。
妖王们是讲究实力的,当然不服比它妖力值低的居然可以排在前面,它们现在想知道在它前面,妖力值比它低,而且离它最远的距离是多少?
Input
第二行输入n个整数,表示每个妖王的妖力值a[i]
n≤2∗105
1≤a[i]≤109
(多组输入)
Output
Sample Input
6
5 50 45 7 10 1
Sample Output
4 3 2 1 0 -1 对于第一个数:5,比它小的数字是1,1距离它最远,最远距离为4
对于第二个数:50,比它小的数字是45 7 10 1,1距离它最远,距离为3
对于第三个数:45,比它小的数字是7 10 1,1距离它最远,距离为2
对于第四个数:7,比它小的数字是10 1,1距离它最远,距离为1
对于第五个数:10,比它小的数字是1,1距离它最远,距离为0
对于第六个数:已经没有比它小的数字了,距离为-1
Author
我们可以二分右边的那个区间,如果右区间的r[i]<当前的数说明可以向右延伸;
#pragma comment(linker, "/STACK:1024000000,1024000000")
#include<iostream>
#include<cstdio>
#include<cmath>
#include<string>
#include<queue>
#include<algorithm>
#include<stack>
#include<cstring>
#include<vector>
#include<list>
#include<set>
#include<map>
using namespace std;
#define ll long long
#define pi (4*atan(1.0))
#define eps 1e-14
#define bug(x) cout<<"bug"<<x<<endl;
const int N=1e5+,M=1e6+,inf=;
const ll INF=1e18+,mod=;
int a[N];
int r[N];
int main()
{
int n;
while(~scanf("%d",&n))
{
for(int i=;i<=n;i++)
scanf("%d",&a[i]);
r[n]=a[n];
for(int i=n-;i>=;i--)
r[i]=min(r[i+],a[i]);
for(int i=;i<=n;i++)
{
int st=i+;
int en=n,ans=-;
while(st<=en)
{
int mid=(st+en)>>;
if(a[i]>r[mid])
{
st=mid+;
ans=mid;
}
else
en=mid-;
}
if(ans==-)
printf("-1");
else
printf("%d",ans-i-);
printf("%c",((i==n)?'\n':' '));
}
}
return ;
}
实在不会还有这种的(利用C++STL)
下面给出AC代码:
#include <cstdio>
#include <cstring>
#include <vector>
#include <algorithm>
#define MAX 200002
using namespace std; int a[MAX],ans[MAX];
vector<int> v,num;
#define freout freopen("out.txt","w",stdout)
#define frein freopen("in.txt","r",stdin)
int main()
{ int n;
while(~scanf("%d",&n)){
for(int i=;i<n;i++) scanf("%d",&a[i]);
v.clear();
num.clear();
for(int i=n-;i>=;i--){
if(v.size()== || v.back()>=a[i]){
v.push_back(a[i]); num.push_back(i);
ans[i]=-;
}else{
int j = (lower_bound(v.rbegin(),v.rend(),a[i]) - v.rbegin());
// printf("%d %d\n",a[i],j);
j = (int)v.size() - j ;
//printf("%d %d\n",num[j+1],j);
ans[i] = num[j] - i - ;
}
}
for(int i=;i<n;i++){
if(i) printf(" ");
printf("%d",ans[i]);
}
printf("\n");
}
return ;
}