1、购物单
#include<iostream>
using namespace std;
int main(){
double a,b;
double sum=0;
while(cin>>a>>b){
sum+=a*b;
cout<<"sum="<<sum<<endl;
}
return 0;
}
//结果5200
2、等差素数列
#include<iostream>
using namespace std;
int prime[100050];
int num=0;
bool f[400050]={false};
void Findprime(){
for(int i=2;i<400000;i++){
if(!f[i]){
prime[num++]=i;
for(int j=2*i;j<400000;j+=i){
f[j]=true;
}
}
}
}
int main(){
Findprime();//f中 false为素数,true为非素数
for(int i=2;i<10000;i++){//枚举公差
for(int j=2;j<num;j++){//枚举起始点
for(int k=j;k<j+10*i&&k<4000000;k+=i){
if(f[k]) break;
if(k==j+9*i) cout<<i<<" "<<j<<" "<<k<<" "<<f[k]<<endl;
}
}
}
cin>>num;
return 0;
}
3、承压计算
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
double a[35][35]={0},b[35][35]={0};
int main(){
for(int i=1;i<30;i++){
for(int j=1;j<=i;j++){
cin>>a[i][j];
}
}
for(int i=1;i<=30;i++){
for(int j=1;j<=i;j++){
if(j==1) b[i][1]+=b[i-1][1]/2+a[i-1][1]/2;
else if(j==i) b[i][j]+=b[i-1][j-1]/2+a[i-1][j-1]/2;
else b[i][j]+=(b[i-1][j-1]+b[i-1][j])/2+(a[i-1][j-1]+a[i-1][j])/2;
}
}
double m1=10000,m2=0;
for(int i=1;i<=30;i++){
m1=min(m1,b[30][i]);
m2=max(m2,b[30][i]);
}
cout<<m1<<" "<<m2<<endl;
printf("%lf\n",2086458231/m1*m2);
while(1);
return 0;
}
4、方格分割
#include<iostream>
using namespace std;
bool vis[7][7]={false};
int num=0,dx[4]={0,0,1,-1},dy[4]={1,-1,0,0};
void DFS(int x,int y){
if(x==0||x==6||y==0||y==6){
num++;
return;
}
for(int i=0;i<4;i++){
if(!vis[x+dx[i]][y+dy[i]]) {
vis[x][y]=vis[6-x][6-y]=true;
DFS(x+dx[i],y+dy[i]);
vis[x][y]=vis[6-x][6-y]=false;
}
}
}
int main(){
DFS(3,3);
cout<<num/4<<endl;
}
5、取数位
#include<cstdio>// 求x用10进制表示时的数位长度
int len(int x){
if(x<10) return 1;
return len(x/10)+1;
}
// 取x的第k位数字
int f(int x, int k){
if(len(x)-k==0) return x%10;
return f(x/10,k); //填空
}
int main()
{
int x = 23574;
printf("%d\n", f(x,3));
return 0;
}
6、最大公共子串
#include <stdio.h>
#include <string.h>
#define N 256
int f(const char* s1, const char* s2){
int a[N][N];
int len1 = strlen(s1);
int len2 = strlen(s2);
int i,j;
memset(a,0,sizeof(int)*N*N);
int max = 0;
for(i=1; i<=len1; i++){
for(j=1; j<=len2; j++){
if(s1[i-1]==s2[j-1]) {
a[i][j] = a[i-1][j-1]+1; //填空
if(a[i][j] > max) max = a[i][j];
}
}
}
return max;
}
int main(){
printf("%d\n", f("abcdkkk", "baabcdadabc"));
return 0;
}
7、日期问题
#include<iostream>
#include<cstdio>
#include<set>
using namespace std;
int month[13] = { 0,31,28,31,30,31,30,31,31,30,31,30,31 };
int seek(int x,int y,int z){
if(x>=60) x+=1900;
else x+=2000;
if ((x % 4 == 0 && x % 100 != 0) || x % 400 == 0) {
month[2] = 29;
}
if(y>12||month[y]<z) return -1;
return x*10000+y*100+z;
}
int main() {
int a,b,c;
set<int> s;
scanf("%d/%d/%d",&a,&b,&c);
s.insert(seek(a,b,c));
s.insert(seek(c,a,b));
s.insert(seek(c,b,a));
for(set<int>::iterator it=s.begin();it!=s.end();it++){
if(*it!=-1) printf("%d-%02d-%02d\n",*it/10000,*it/100%100,*it%100);
}
return 0;
}
8、包子凑数
#include<iostream>
#include<algorithm>
#include<cstdio>
using namespace std;
int a[110],n;
bool dp[10010];
int gcd(int a,int b){
if(b == 0) return a;
return gcd(b,a%b);
}
int main(){
cin>>n;
for(int i = 0 ; i < n ; i ++){
cin>>a[i];
}
int t = a[0];
for(int i = 1 ; i < n ; i ++)
t = gcd(t,a[i]);
if(t != 1)
cout<<"INF"<<endl;
else{
dp[0] = true;
for(int i = 0 ; i < n ; i ++){
for(int j = 0 ; j + a[i] <10000; j++){
if(dp[j]) dp[j+a[i]]=true;
}
}
int count = 0;
for(int i=1;i<10000;i++){
if(!dp[i]) count++;
}
cout<<count<<endl;
}
return 0;
}
9、分巧克力
#include<iostream>
#include<algorithm>
using namespace std;
struct qkl{
int h,w;
}s[100050];
int n,k;
bool ok(int x){//验证x作边长是否满足
int t=0;
for(int i=0;i<n;i++){
t+=(s[i].h/x)*(s[i].w/x);
if(t>=k) return true;
}
return false;
}
int main(){
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>s[i].h>>s[i].w;
}
int l=1,r=100000;
while(l<=r){
int x=(l+r)/2;
if(ok(x)) l=x+1;
else r=x-1;
}
l++;
while(l--){
if(ok(l)) break;
}
cout<<l;
return 0;
}
10、K倍区间
#include<iostream>
#include<map>
using namespace std;//(sum[r]-sum[l-1])%k == 0转化为sum[r]%k==sum[l-1]%k,
int main(){
long long n,k,t,sum[100050]={0},num=0;
map<int,int> mp;
cin>>n>>k;
for(int i=0;i<n;i++){
cin>>t;
sum[i+1]=(sum[i]+t)%k;
}
for(int i=1;i<=n;i++){//复杂度O(n)
num+=(mp[sum[i]]++);//当sum[l]%k==sum[r]%k 且l!=r的数据
}
num+=mp[0];//l等于r时,即前l==r项和等于k整数倍的数据个数
cout<<num;
return 0;
}
/*复杂度O(n方)
for(int l=1;l<=n;l++){
for(int r=l;r<=n;r++){
if((sum[r]-sum[l-1])%k==0) num++;
}
}*/