复杂问题分析思维训练
搬砖
题目描述
搬砖,使人劳累。
小可通过计算得知:搬一块砖,需要使用 i 力气,接着去搬第二块砖,需要使用2×i 力气,以此类推,接着去搬第 k 块砖,需要使用k×i 力气。
现在已知小可现在总共有n 的力气,如果连续搬w 块砖,小可相差了多少力气?
输入描述
第一行包含三个正整数k,n,w(1≤k,w≤1000,0≤n≤109),分别代表搬第一块砖的力气、小可现在有的力气数和要搬走的砖数。
输出描述
输出一个整数表示相差的力气值。如果现在完全可以搬w 块转,输出 0。
输入样例
3 17 4
输出样例
13
代码
#include<iostream>
#include<stack>
#include<string>
#include<cstdio>
using namespace std;
int main(){int n,k,w ;cin>>k>>n>>w;cout<<((k+k*w)*w)/2-n;return 0;
}
计算两个日期之间的天数
题目描述
给定两个日期,计算相差的天数。比如2010-1-1和2010-1-3相差2天。
输入描述
共两行
第一行包含三个整数startYear,startMonth,startDay,分别是起始年、月、日。
第二行包含三个整数endYear,endMonth,endDay,分别是结束年、月、日。 相邻两个整数之间用单个空格隔开。 年份范围在1~3000。保证日期正确且结束日期不早于起始日期。
输出描述
输出一个整数,即是两个日期相差的天数。
样例
输入
2008 1 1 2009 1 1
输出
366
提示
闰年被定义为能被4整除的年份,但是能被100整除而不能被400整除的年是例外,它们不是闰年。闰年的2月份有29天。
代码
#include<iostream>
#include<stack>
#include<cstdio>
using namespace std;
int n;
int y1,y2,m1,m2,d1,d2;
int y[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
bool rn(int n){if(n%4==0&&n%100!=0||n%400==0){return 1;}else{return 0;}
}
int main(){cin>>y1>>m1>>d1>>y2>>m2>>d2;long long sum=0;for(int i=y1+1;i<=y2-1;i++){if(rn(i)){sum+=366;}else{sum+=365;}}if(rn(y1)){y[2]=29;} else{y[2]=28;}if(y1==y2&&m1!=m2){for(int i=m1+1;i<=m2-1;i++){sum+=y[i];}sum+=y[m1]-d1;sum+=d2;}else if(y1!=y2){sum+=y[m1]-d1;for(int i=m1+1;i<=12;i++){sum+=y[i];}sum+=d2;for(int i=1;i<=m2-1;i++){sum+=y[i];}}else if(y1==y2&&m1==m2){sum+=d2-d1;}cout<<sum;return 0;
}
具有前导0的回文数
题目描述
给定一个整数N。判断是否可以在整数N的开头添加零个或多个0,以得到回文数?(回文数是从前面读和从后面读都相同的数)
输入描述
输入一个正整数 n
输出描述
如果可以在前面加上0个或多个0构成回文数,则输出YES,否则输出NO
输入样例
1210
输出样例
YES
数据描述
0≤n≤10的9次方
代码
#include<iostream>
#include<stack>
#include<string>
#include<cstdio>
using namespace std;
long long n;
long long hw(long long n){long long a=0;while(n){a=a*10+n%10;n/=10;}return a;
}
int main(){cin>>n;while(n%10==0){n/=10;}if(hw(n)==n){cout<<"YES";}else{cout<<"NO";}return 0;
}