寒假训练 第一个周
错误票据
这道题难在输入 ,输入挠破脑袋,我用了两个whlie进行限制
while(n--)
{
while(cin>>a[i])
{
i++;
if(cin.get()=='\n')
{
break;
}
}
#include<iostream> #include<cstdio> #include<algorithm> #define N 100001 using namespace std; int main() { int n,i=0; cin>>n; int a[N]; while(n--) { while(cin>>a[i]) { i++; if(cin.get()=='\n') { break; } } } sort(a,a+i); int m,n1; for(int j=0;j<i-1;j++) { if(a[j]==a[j+1]) { n1=a[j]; } if(a[j]==a[j+1]-2) { m=a[j+1]-1; } } printf("%d %d\n",m,n1); return 0; }
这样子限制的死死的,输入到一个一维数组中,进行简单的判断就可以了
下面是翻硬币
思路:直接搞两个数组作比较,然后符号不相同进行反面,直到两个数组相同为止,用数统计反面次数。
#include<iostream> #include<cstdio> #include<algorithm> #include <cstring> #define N 1000 using namespace std; int main() { char a[N],b[N]; int sum=0,m=0; cin>>a>>b; m=strlen(a); for(int i=0;i<m-1;i++) { if(a[i]!=b[i]) { if(a[i+1]=='*') { a[i+1]='o'; } else { a[i+1]='*'; } sum++; } } cout<<sum; return 0; }
特别数的和
这个题需要分离数位,就是除以/10然后用%10
个位直接%10
十位/10后%10
百位/10/10%10后得出以此类堆
分离后比较即可
可以使用两个for进行分离如下
#include<iostream> #include<cstdio> #include<algorithm> using namespace std; int main() { int n,a=0; long long int sum=0; cin>>n; for(int i=1;i<=n;i++) { for(int j=i;j>0;j=j/10) { a=j%10; if (a == 1 || a == 0 || a == 2 || a== 9) { sum=sum+i; break; } } } cout<<sum; return 0; }
完全二叉树
思路:把每一层相加即可,用一个一维数组,重点在于如何去访问这个一维数组达到二叉树的效果
for(int i=1;i<=n;i=i*2) { long long s=0; for(int j=i;j<i*2&&j<=n;j++) { s=s+a[j]; } if(max<s) { max=s; res=be; } be++;
上面用了两个for奇妙的连接最后的res就是答案
注意,每一个二叉树的层段就是i=1;i=i*2,这就是元数个数,同时也可用这个来去访问一维数组。
带分数:
该题利用暴力枚举一一列举即可
for循环一个一个找
x=x*10+下一个数值,一个一个排位
再利用函数
next_permutation进行数字排列
#include<iostream> #include<cstdio> #include<algorithm> #include <cstring> #include<cmath> using namespace std; int a[9]={1,2,3,4,5,6,7,8,9}; int work(int x,int y) { int sum=0; for(int i=x;i<=y;i++) { sum=sum*10+a[i]; } return sum; } int main() { int n; cin>>n; int ans=0; do { for(int i=0;i<7;i++) { int b=work(0,i); if(b>n) break; for(int j=i+1;j<8;j++) { int c=work(i+1,j); int d=work(j+1,8); if(c%d==0&&b+c/d==n) { ans++; } } } }while(next_permutation(a,a+9)); cout<<ans; return 0; }
英文题
E. Challenging Valleys
题意:就是不能让数下降两次,上升后不能在下降
坑:::按照正常思路写会无法通过一至下降的例子,所以要加限制条件
#include<iostream> #include<cstdio> #include<algorithm> #include <cstring> #include<cmath> int a[1000010]; using namespace std; int main() { int n; cin>>n; while(n--) { int b; cin>>b; for(int i=1;i<=b;i++) { cin>>a[i]; } long int f=0; for(int i=1;i<b;i++) { if(a[i]<a[i+1]) { f=i; break; } } long int p=0; for(int j=f;j<b;j++) { if(a[j]>a[j+1]) { p=1; } } if(p==1&&f!=0) { cout<<"NO"<<endl; } else { cout<<"YES"<<endl; } } return 0; }