三元组
由于数据不是很大,这题可以用三重循环去写。
代码
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
int m;
cin>>m;
int a[m+1];
int i,ans=0,j,k;
for(i=1;i<=m;i++)
cin>>a[i];
for(i=1;i<=m;i++)
{
for(j=i;j<=m;j++)
{
for(k=j+1;k<=m;k++)
{
if(a[k]==a[i]+a[j])
ans++;
}
}
}
cout<<ans<<'\n';
}
}
单位转化
观察可以知道一件很重要的事情,数字后面跟着的那个字母,比如说kb,k很重要,以此类推,去特判就好了,然后分情况讨论,由于不知道怎么用cout保留六位,所以直接printf。
#include<bits/stdc++.h>
using namespace std;
int main() {
char s[13];
int n[4];
double num=0.0,j=0.0;
char ch,c;
cin >> s;
for (int i = 0; i < strlen(s); i++) {
if (s[i] == '?') { ch = s[i + 1]; break; }
}
for (int i = 0; i < strlen(s); i++) {
if ('A'<=s[i]&&s[i]<='Z') {
c = s[i]; break;
}
n[i] = s[i]-'0';
j++;
}
for (int i = 0; ; i++) {
num += n[i] * pow(10,j-1);
j--;
if (j == 0) break;
}
if (c == 'G') {
if (ch == 'M') printf("%.6lf", num * pow(2, 10));
else if (ch == 'K')printf("%.6lf", num * pow(2, 20));
else if (ch == 'B') printf("%.6lf", num * pow(2, 30));
else printf("%.6f", num);
}
else if (c == 'M') {
if (ch == 'G') printf("%.6lf", num / pow(2, 10));
else if (ch == 'K')printf("%.6lf", num * pow(2, 10));
else if(ch=='B')printf("%.6lf", num * pow(2, 20));
else printf("%.6f", num);
}
else if (c == 'K') {
if (ch == 'G') printf("%.6lf", num / pow(2, 20));
else if (ch == 'M')printf("%.6lf", num /pow(2, 10));
else if(ch=='B')printf("%.6lf", num * pow(2, 10));
else printf("%.6f", num);
}
else if (c == 'B') {
if (ch == 'G') printf("%.6lf", num / pow(2, 30));
else if (ch == 'M') printf("%.6lf", num / pow(2, 20));
else if(ch=='K')printf("%.6lf", num / pow(2, 10));
else printf("%.6f", num);
}
}
乘方
题意很好理解,一旦超出了范围就给它枪毙,小于就输出。那么一个循环判断解决。
#include<bits/stdc++.h>
using namespace std;
#define ll long long
bool check(int a,int b)
{
ll sum=1;
for(int i=0;i<b;i++)
{
sum*=a;
if(sum>1000000000)
return 0;
}
return 1;
}
int main()
{
ll a,b;
cin>>a>>b;
if(!check(a,b))
cout<<"-1";
else
cout<<(ll)pow(a,b);
}
grave
这道题其实就是问一个矩形里面已经有一个矩形了,挖掉那个矩形然后分成四个矩形,能不能放的下,可以直接去判断和计算。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int a[4];
int i;
int b[4];
for(i=0;i<4;i++)
cin>>a[i];
for(i=0;i<4;i++)
cin>>b[i];
int n,m;
cin>>n>>m;
if(b[0]-a[0]>=n&&a[3]-a[1]>=m)
cout<<"Yes";
else if(a[2]-b[2]>=n&&a[3]-a[1]>=m)
cout<<"Yes";
else if(a[2]-a[0]>=n&&a[3]-b[3]>=m)
cout<<"Yes";
else if(a[2]-a[0]>=n&&b[1]-a[1]>=m)
cout<<"Yes";
else
cout<<"No";
}
bus
就是一道简单推公式的题目,本质上不难,可以一个循环解决,但是得初始化n=0。因为这是个倒推。
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n=0;
int k;
int m;
cin>>m;
while(m--)
{
n=0;
cin>>k;
while(k--)
{
n*=2;
n=n+1;
}
cout<<n<<endl;
}
}
采药
一个简单的01背包模板题,之前训练过了,搞清楚关系就可以了。
#include<bits/stdc++.h>
using namespace std;
int dp[105][1005];
int t[110];
int value[105];
int main()
{ memset(dp,0,sizeof(dp));
int T,M;
cin>>T>>M;
int i,j;
for(i=1;i<=M;i++)
{
cin>>t[i]>>value[i];
}
for(i=1;i<=M;i++)
{
for(j=1;j<=T;j++)
{
if(t[i]>j)
dp[i][j]=dp[i-1][j];
else
dp[i][j]=max(dp[i-1][j],dp[i-1][j-t[i]]+value[i]);
}
}
int max=0;
for(i=1;i<=M;i++)
{
for(j=1;j<=T;j++)
{
if(max<dp[i][j])
max=dp[i][j];
}
}
cout<<max;
}
素数回文数的个数
用了个小花招,熟悉的标记法熟悉的味道,然后构造个回文函数就好了,看是否反过来相等,如果又是回文数又是素数那就是所求。
#include<bits/stdc++.h>
using namespace std;
bool prime(int k)
{
for(int i=2;i<k;i++)
{
if(k%i==0)
return 0;
}
return 1;
}
bool huiwen(int n)
{
int i=0,j=0,a[10000],b[10000];
while(n!=0)
{
a[i]=n%10;
n/=10;
i++;
}
for(int k=i-1;k>=0;k--)
{
b[j]=a[k];
j++;
}
for(int l=0;l<i;l++)
{
if(a[l]!=b[l])
return 0;
}
return 1;
}
int main()
{
int n;
int ans=0;
cin>>n;
for(int i=11;i<=n;i++)
{
if(prime(i)==1 && huiwen(i)==1)
ans++;
}
cout<<ans;
}
真素数
我们得清楚真素数的定义,就是倒过来还是素数,其实和上面大同小异,还是标记法,然后看看是不是都是素数就行了。
#include<bits/stdc++.h>
using namespace std;
int change(int k)
{
int j=0,i;
int s[100000];
while(k)
{
s[j++]=k%10;
k/=10;
}
int sum=0;
for(i=0;i<=j-1;i++)
{
sum*=10;
sum+=s[i];
}
return sum;
}
int main()
{
int n,m,i,j,flag=0;
int isprime[100000];
for(i=0;i<100000;i++)
isprime[i]=1;
for(i = 2; i <= 100000; i++)
{
if(isprime[i])
{
for(j = 2 * i; j <= 100000; j += i)
{
isprime[j] = 0;
}
}
}
cin>>n>>m;
for(i=n;i<=m;i++)
{
if(isprime[change(i)]&&isprime[i])
{
if(flag)
cout<<",";
printf("%d",i);
flag=1;
}
}
if(flag==0)
cout<<"No";
}