@Asuna
2016-10-12T12:29:07.000000Z
字数 9270
阅读 846
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是有n个人要交换礼物,其中第i个人会把礼物送给第a[i]个人,要输出第i个人收到了谁的礼物。
分析:这可难倒了本萌妹了。但就在本萌妹晚上看美剧的时候突然灵光一现!其实建两个数组,一个数组存储输入数据,另一个数组将下标与对应元素数值调换后再次存入其中再输出就结束啦。
参考代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cmath>
using namespace std;
int n,a[105],b[105];
int main()
{
cin>>n;
for (int i=1; i<=n; i++)
cin>>a[i];
for (int i=1; i<=n; i++)
b[a[i]]=i;
for (int i=1; i<=n; i++)
cout<<b[i]<<" ";
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实这题就是定义了一个tor运算,这个tor运算非常的高大上,因为他可以把你输入的两个十进制数分别转换成三进制数并且在各个位上进行加法操作(但注意了!不会进位的!!!)然后重新转换成1个十进制数。
分析:这可难倒了本萌妹了。但就在本萌妹晚上学OC的时候突然灵光一现!(tmd这OC简直难爆了)其实我们只需要模拟三进制每一位的转换,从末位往前依次进行转换并相加即可,具体看代码啦啦啦我也讲不清楚。。和二进制差不多的啦,加油哦。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
int a,b=0,c,q=1,s,t;
int main()
{
cin>>a>>c;
s=a;
t=c;
while (t!=0 || s!=0)
{
b+=((t%3-s%3+3)%3)*q;
//cout<<b<<" "<<a<<" "<<c<<" "<<q<<endl;
q*=3;
s/=3;
t/=3;
}
cout<<b<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是给定一串含C和P的字符串,一次只能读字母相同的,并且就算相同的最多也只能一次读5个,问要多少次能把字符串读完。
分析:这可难倒了本萌妹了。但就在本萌妹晚上刷漫画的时候突然灵光一现!其实我们只要。。。只要。。。就模拟嘛。。。搞个sum计算相同的出现了多少个了,一到5就次数加一,碰到不同的也加一嘛。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
using namespace std;
string s;
char c;
int i,l,sum,ans=0;
int main()
{
cin>>s;
c=s[0];
l=s.size();
i=1;
sum=5;
while (l>0)
{
if (c!=s[i])
{
ans++;
c=s[i];
sum=5;
}else sum--;
if (sum==0)
{
ans++;
sum=5;
}
i++;
l--;
}
cout<<ans<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是给了n个数,最后要把这串数变为1~n,看要改变多少个数。
分析:这可难倒了本萌妹了。但就在本萌妹晚上找电影看的时候突然灵光一现!其实我们只要设置一个标记数组,标记哪些数字出现了,然后再扫一遍1~n,若有没出现的数字就把答案加一。
参考代码:
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
using namespace std;
int n,a[5005],b[5005],ans=0;
int main()
{
memset(b,false,sizeof(b));
cin>>n;
for (int i=1; i<=n; i++)
{
cin>>a[i];
// b[a[i]]++;
}
sort(a+1,a+n+1);
for (int i=1; i<=n; i++)
b[a[i]]=true;
for (int i=1; i<=n; i++)
if (b[i]==false) ans++;
cout<<ans<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是有一本n页的书,并且我们知道从周一到周五我们分别能看多少页,周数是无限的且每周的每天看的页数相同。问最后是周几看完的。
分析:这可难倒了本萌妹了。但就在本萌妹晚上和闺蜜卿卿我我的时候突然灵光一现!其实就mod一下一周看的总页数,然后就可以暴力判断是哪天看完的了。特别需要注意的是假设mod完以后是0即是在某一周结束的时候看完的,那么我们需要找到一周最靠后且看的页数不为0的那天即为答案。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<string>
#include<cmath>
using namespace std;
int a[8],n,ans,sum,k,j=1;
int main()
{
cin>>n;
for (int i=1; i<=7; i++)
{
cin>>a[i];
sum+=a[i];
}
k=n%sum;
//cout<<k<<endl;
if (k==0)
{
for (int i=1; i<=7; i++)
if (a[i]!=0) j=i;
ans=j;
}
if (k!=0)
{
if (k<=a[1]) ans=1;
if (k>a[1] && k<=a[1]+a[2]) ans=2;
if (k>a[1]+a[2] && k<=a[1]+a[2]+a[3]) ans=3;
if (k>a[1]+a[2]+a[3] && k<=a[1]+a[2]+a[3]+a[4]) ans=4;
if (k>a[1]+a[2]+a[3]+a[4] && k<=a[1]+a[2]+a[3]+a[4]+a[5]) ans=5;
if (k>a[1]+a[2]+a[3]+a[4]+a[5] && k<=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]) ans=6;
if ((k>a[1]+a[2]+a[3]+a[4]+a[5]+a[6] && k<=a[1]+a[2]+a[3]+a[4]+a[5]+a[6]+a[7])) ans=7;
}
cout<<ans<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是给我们三个字符串ABC,看A+B和C的字母组成是否完全相同。
分析:这可难倒了本萌妹了。但就在本萌妹晚上晾衣服的时候突然灵光一现!其实我们只需要把AB串在一起每个字母排个序,把C也排个序,然后看看AB串是否就是C串即可。
参考代码:
#include<iostream>
#include<cstring>
#include<cstdlib>
#include<algorithm>
#include<string>
#include<cstdio>
using namespace std;
string a,b,c;
int lc,j=0,k=0,la;
int main()
{
cin>>a>>b>>c;
a+=b;
sort(a.begin(),a.end());
lc=c.size();
la=a.size();
//cout<<la<<endl;
sort(c.begin(),c.end());
if (lc>la)
for (int i=la; i<=lc; i++)
a+="0";
if (lc<la)
for (int i=lc; i<=la; i++)
c+="0";
//cout<<la<<endl;
lc=c.size();
for (int i=0; i<la; i++)
if (a[i]==c[i]) j++;
//cout<<j<<endl;
if (j==lc)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是2X2的矩形,要求对角线,横竖的和都是给定的数且矩形内只能填1~9,求矩形。
分析:这可难倒了本萌妹了。但就在本萌妹晚上看风景的时候突然灵光一现!其实我们暴力枚举一个格子1~9,用给定的几个数把剩下三格推出来,判断是否可行即可。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<cstring>
#include<string>
#include<algorithm>
using namespace std;
int r1,r2,d1,d2,c1,c2,x1=1,x2,yy1,y2;
int main()
{
cin>>r1>>r2;
cin>>c1>>c2;
cin>>d1>>d2;
while (x1<10)
{
x2=r1-x1;
yy1=c1-x1;
y2=d1-x1;
if (x2+y2==c2 && yy1+y2==r2 && x2+yy1==d2)
if (x1!=x2 && x1!=yy1 && x1!=y2)
if (x2!=yy1 && x2!=y2 && yy1!=y2)
if (x2>=1 && x2<=9 && yy1>=1 && yy1<=9 && y2>=1 && y2<=9)
{
cout<<x1<<" "<<x2<<endl;
cout<<yy1<<" "<<y2<<endl;
return 0;
}
x1++;
}
cout<<-1<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是字符串转化问题,不过多赘述,题都不用看看样例即可。
分析:这可难倒了本萌妹了。但就在本萌妹晚上唱情歌的时候突然灵光一现!其实我们只要先判断正负,整数小数用两个数组储存,整数部分每三位打个“,”,小数部分注意不足两位补“0”,超过两位取两位即可。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<cmath>
using namespace std;
string s,z,x;
bool bx=false;
int ls,lz,lx;
int main()
{
cin>>s;
ls=s.size();
if (s[0]=='-') cout<<"(";
cout<<"$";
for (int i=0; i<s.size(); i++)
{
if (s[i]=='.') bx=true;
if (s[i]>='0' && s[i]<='9')
if (bx==true) x+=s[i];
else z+=s[i];
}
lz=z.size();
lx=x.size();
//cout<<lx<<endl;
if (lz==0) cout<<0;
else
{
for(int i=0; i<lz; i++)
{
if((lz-i)%3==0)
{
if(i!=0) cout<<",";
}
cout<<z[i];
}
}
cout<<".";
for (int i=0; i<2; i++)
if (lx>i) cout<<x[i];
else cout<<0;
if (s[0]=='-') cout<<")";
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是一定只有4和7两个数字组成,且前n/2个数的和和后n/2个数的和相等就是lucky ticket。
分析:这可难倒了本萌妹了。但就在本萌妹晚上约汉子的时候突然灵光一现!(立刻就跑回宿舍刷题了)其实只要读入字符串,先判断有无除了4、7之外的数字,若没有每一位转成int,求前后和判断即可。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,sum1=0,sum2=0;
string s;
int main()
{
cin>>n;
cin>>s;
int flag=1;
for (int i=0; i<n; i++)
if (s[i]!='4' && s[i]!='7')
{
cout<<"NO"<<endl;
return 0;
}
for (int i=0; i<n/2; i++)
sum1+=(s[i]-'0');
//cout<<sum1<<endl;
for (int i=n-1; i>=n/2; i--)
sum2+=(s[i]-'0');
//cout<<sum2<<endl;
if (sum1!=sum2) cout<<"NO"<<endl;
else cout<<"YES"<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是给定a,b,要求比a大的其中幸运数包含b的最小那个数。(具体看题目有数字的部分吧。。。)
分析:这可难倒了本萌妹了。但就在本萌妹晚上卸妆的时候突然灵光一现!其实只要让一个数从a开始滚,然后用一个k记录这个数中的幸运数是什么,当k==b的时候就找到了。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cmath>
#include<algorithm>
using namespace std;
long long a,b,ans,k,q,ans1;
int main()
{
cin>>a>>b;
ans1=a+1;
while (k!=b)
{
k=0;
q=1;
ans=ans1;
while (ans>0)
{
if (ans%10==4 || ans%10==7)
{
k+=q*(ans%10);
q*=10;
}
ans/=10;
}
ans1++;
}
cout<<ans1-1<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是给4个数和一个k,看1~k中有几个数是这4个数中其中一个的倍数。
分析:暴力找呗,本萌妹都会做哼~
参考代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<cstdlib>
using namespace std;
int a[10],d,j,ans;
bool bo=false;
int main()
{
for (int i=1; i<=4; i++)
cin>>a[i];
cin>>d;
j=1;
while (j<=d)
{
for (int i=1; i<=4; i++)
if ((j%a[i]==0))
{
bo=true;
}
if (bo==true) ans++;
//cout<<j<<" "<<bo<<endl;
bo=false;
j++;
}
cout<<ans<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是给n个球员,分成两队,要满足题目给定的三个条件。输出的是球员的号数哦~
分析:这可难倒了本萌妹了。但就在本萌妹晚上画工程图的时候突然灵光一现!其实我们只需要标记下每个人的号数,然后按照他们的能力排个序,隔开相邻两个人分队即可。(我代码手打快排有问题求各位dalao们看了帮我优化一蛤)
参考代码:
#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<cstring>
#include<algorithm>
#include<vector>
using namespace std;
struct node
{
int v;
int p;
}a[100005];
int n;
bool cmp(node x,node y)
{
if (x.v==y.v) return x.p<y.p;
else return x.v<y.v;
}
/*void qsort(int l,int r)
{
int l1=l,r1=r;
bool flag=true;
int q=a[l1].v,o=a[l1].p;
while (l<r)
{
while (l<r && ((a[r].v>q) || (a[r].v==q && a[r].p>o)))
{
r--;
flag=false;
}
a[l]=a[r];
while (l<r && ((a[l].v<q) || (a[l].v==q && a[l].p<o)))
{
l++;
flag=false;
}
a[r]=a[l];
}
a[l].v=q;
a[l].p=o;
//cout<<a[l].v<<" "<<a[l].p<<endl;
if (!flag)
{
qsort(l1,l-1);
qsort(l+1, r1);
}
}*/
int main()
{
cin>>n;
for (int i=1; i<=n; i++)
{
cin>>a[i].v;
a[i].p=i;
}
sort(a+1,a+n+1,cmp);
/*for (int i=1; i<=n; i+=1)
cout<<a[i].v<<" ";
cout<<endl;
for (int i=1; i<=n; i+=1)
cout<<a[i].p<<" ";
cout<<endl;*/
cout<<(n+1)/2<<endl;
for (int i=1; i<=n; i+=2)
cout<<a[i].p<<" ";
cout<<endl;
cout<<n/2<<endl;
for (int i=2; i<=n; i+=2)
cout<<a[i].p<<" ";
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实各位dalao看看样例解释就能明白了。。这道题题意要这么讲清楚真的很难呐呐呐呐。。。
分析:这可难倒了本萌妹了。但就在本萌妹晚上写国二卷的时候突然灵光一现!其实就是个贪心。具体怎么贪心嘿嘿。。程序里有哟。
参考代码:
#include<iostream>
#include<cstring>
#include<cstdio>
#include<cmath>
#include<cstdlib>
using namespace std;
int n,k,l,c,d,p,nl,np,sum1,sum2,sum3,sum4,ans;
int main()
{
cin>>n>>k>>l>>c>>d>>p>>nl>>np;
sum1=(k*l)/nl;
sum2=p/np;
sum3=c*d;
sum4=min(sum2,sum3);
ans=min(sum1,sum4);
ans/=n;
cout<<ans<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,其实就是n个人m科学科,只要这个人在某一学科成绩是所有人中最高的(可以相等),那这个人就是优秀的,判断有几个人是优秀的。
分析:这可难倒了本萌妹了。但就在本萌妹晚上抱果聚大腿的时候突然灵光一现!其实只要把每科需要达到优秀的成绩算出来,再把每个人的每科成绩拿来判断,要是有一个和最高分相等,那就标记为1。最后统计有多少1即可。
参考代码:
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cstdlib>
#include<cmath>
using namespace std;
int n,s,maxx,a[10005],ans,b[1005];
char c;
int main()
{
cin>>n>>s;
for (int i=0; i<n; i++)
{
for(int j=0; j<s; j++)
{
cin>>c;
a[i*s+j]=c-'0';
}
}
for (int i=0; i<n; i++)
b[i]=0;
for (int i=0; i<s; i++)
{
maxx=0;
for(int j=0; j<n; j++)
{
maxx=max(maxx,a[j*s+i]);
}
for(int j=0; j<n; j++)
{
if (a[j*s+i]==maxx) b[j]=1;
}
}
//for (int i=0; i<n; i++) cout<<b[i]<<" ";
//cout<<endl;
for (int j=0; j<n; j++)
{
ans+=b[j];
}
cout<<ans<<endl;
return 0;
}
题意:这是一道难度极大的题。本萌妹苦思冥想许久才明白这道题要我做什么,给定一个矩形大小和起始位置,给定一个k和k个向量,每个向量走到不能走为止,求最后走了几步。
分析:这可难倒了本萌妹了。但就在本萌妹晚上睡觉睡到一半的时候突然灵光一现!每个向量都判断走多少步出边界,依次判断最大步数即可。
参考代码:
#include<iostream>
#include<cstdio>
#include<cmath>
#include<cstring>
#include<cstdlib>
using namespace std;
long long n,m,x,y,k,dx,dy,sum,ans,xx=1000000000,yy=1000000000;
int main()
{
cin>>n>>m>>x>>y>>k;
while (k>0)
{
xx=1000000000;
yy=1000000000;
cin>>dx>>dy;
if (dx>0) xx=(n-x)/dx;
else
if (dx<0) xx=(x-1)/(-dx);
if (dy>0) yy=(m-y)/dy;
else
if (dy<0) yy=(y-1)/(-dy);
if (xx<yy) sum=xx; else sum=yy;
x+=dx*sum;
y+=dy*sum;
//cout<<x<<" "<<y<<endl;
ans+=sum;
k--;
}
cout<<ans<<endl;
return 0;
}