A 抗疫必胜1
水题 不解释
#include<bits/stdc++.h>
using namespace std;
int main()
{
cout<<"V"<<" "<<"V"<<endl;
cout<<" "<<"V"<<" "<<"V"<<endl;
cout<<" "<<"V"<<" "<<"V"<<endl;
cout<<" "<<"V";
}
B 疫情死亡率
水题 (但是我的codeblocks坏了,用浮点数时会输出0.0000000,现下Dev做的,淦)
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int a, b;
cin>>a>>b;
double c = 100.0 * b / a;//一定要记得乘以100.0 不然就不能输出浮点数了
cout<<fixed<<setprecision(3)<<c<<"%";//用于cout输出指定位数的小数点
return 0;
}
#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
cin>>a>>b;
double c=b*1.0/a;//同样得乘以1.0
printf("%.3lf%%",c*100);
return 0;
}
C 整除判断
水题不解释
#include<bits/stdc++.h>
using namespace std;
int a,b;
int main()
{
cin>>a>>b;
if(a % b == 0) cout<<"YES";
else cout<<"NO";
return 0;
}
D 编程时间
水题不解释
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
int a, b, c, d;
cin>>a>>b>>c>>d;
int sum = 60 - b + (c - a - 1) * 60 + d;
int k = sum / 60;
cout<<k<<" "<<sum - 60 * k;
return 0;
}
E 双位彩
这个题意有点东西啊,我刚开始看不懂题意,对于那个2元的考虑到可能出现的是aa类的数,就是不知道该怎么办,就对于那个2,写了下面一个极傻的方法
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n, m;
cin>>n>>m;
int a = n % 10;
int b = (n / 10) % 10;
int c = m % 10;
int d = (m / 10) % 10;
if(n == m)
cout<<100;
else if(a == d && b == c)
cout<<20;
else if((a == c && b != c && a != d && b != d) || (b == c && a != c && a != d && b != d) || (c != a && c!=b && d == a && d != b)|| (c != a && c!=b && d == b && d != a))
cout<<2;
else
cout<<0;
}
后来结赛看见别人代码发现是我想多了
#include<iostream>
using namespace std;
int main(){
int a,b;
cin>>a>>b;
int a1=a/10;
int a2=a%10;
int b1=b/10;
int b2=b%10;
if(a==b){
cout<<"100";
}else if(a1==b2&&a2==b1){
cout<<"20";
}else if(a1==b2||a2==b1||a1==b1||a2==b2){
//只要我抽的数字有一个能和中奖数字相同就行
cout<<"2";
}else{
cout<<"0";
}
}
F 抗疫必胜2
水题不解释
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
while(n--)
{
cout<<"China will win the battle against COVID-19."<<endl;
}
}
G 成绩统计
水题
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n;
ll sum = 0;
ll tr[10005];
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>tr[i];
sum += tr[i];
}
double k = 1.0 * sum / n;
//cout<<sum<<" "<<k;
sort(tr, tr + n);//其实没必要用数组的,我就是懒得在循环里面写比较语句来找最大最小数,所以写个sort直接取第一个和最后一个数就行。
cout<<fixed<< setprecision(2)<<k;
cout<<" "<<tr[n - 1]<<" "<<tr[0];
return 0;
}
H 抗疫必胜3
抗疫必胜1的升级版
把握好循环的次数就行
这方面的题做得还是太少,所以写的就慢了点(愁人)
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
for(int i = 1; i <= n; i++)
{
for(int j = 1; j < i; j++)
{
cout<<" ";
}
cout<<"V";
for(int j = 0; j < 2 * (n - i) - 1; j++)
{
cout<<" ";
}
if(i != n)
cout<<"V"<<endl;
}
}
I 统计数据
刚开始没做这个题,是因为觉得得计数,用map嫌麻烦就后做这个题,后来发现不用也可以其实
#include <cstdio>
#include <iostream>
#include <algorithm>
#include <map>
struct tangran
{
int a, b;
}tr[10005];
bool cmp(tangran x, tangran y)
{
return x.a > y.a;
}
using namespace std;
map<int,int>mp;
int main()
{
int t, n, m;
scanf("%d",&n);
for(int j = 1; j <= n; j++)
{
scanf("%d",&m);
if(!mp.count(m))
mp[m] = 0;
mp[m]++;
}
std::map<int,int>::iterator it;
int j = 0;
for(it = mp.begin(); it != mp.end(); it++)
{
j++;
tr[j].a = it->first;
tr[j].b = it->second;
}
// cout<<j;
sort(tr + 1, tr + j + 1, cmp);
for(int i = 1; i <= j; i++)
{
cout<<tr[i].a<<"-"<<tr[i].b<<endl;
}
return 0;
}
这个做法看起来是不是真麻烦……
#include<bits/stdc++.h>
using namespace std;
int a,b;
int tr[10005] = {
0};
int main()
{
int n;
cin>>n;
for(int i = 0; i < n; i++)
{
cin>>a;
tr[a]++;
b = max(b,a);//记录最大的数
}
for(int i = b; i > 0; i--)
{
if(tr[i] != 0)
cout<<i<<"-"<<tr[i]<<endl;
}
return 0;
}
这个是不是简单易懂……(学的东西多了,就会把简单的问题复杂化……)
J 子序列求和
水题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int tr[10005];
int n, m, a, b;
cin>>n;
for(int i = 1; i <= n; i++)
{
cin>>tr[i];
}
cin>>m;
while(m--)
{
int sum = 0;
cin>>a>>b;
if(a > n)
cout<<0<<endl;
else if(n >= a && n <= b)
{
for(int i = a; i <= n; i++)
{
sum += tr[i];
}
cout<<sum<<endl;
}
else
{
for(int i = a; i <= b; i++)
{
sum += tr[i];
}
cout<<sum<<endl;
}
}
}
K Simple Question
水题
#include<bits/stdc++.h>
using namespace std;
int main()
{
int n,m,k;
int a = 0;
cin>>n>>m>>k;
for(int i = k; i >0; i--)
{
if(i % n == 0 && i % m == 0)
{
cout<<i<<endl;
a = 1;
break;
}
}
if(a == 0)
cout<<-1;
}
L Wrong Word
这个题和上面的那个I题一样,用map,不过这次是map<char, int>
这个题就是C(n,m)的利用。
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
map<char, int>mp;
ll f(ll a, ll b)
{
ll j = 1;
if(b > a/2+1)
b = a-b;
for(ll i=1; i<=b; ++i)
{
j*=(a-i+1);
j/=i;
}
return j;
}
int main()
{
int k = 1;
int m = 1;
int sum = 0;
string s;
cin>>s;
int n = s.size();
for(int i = 0; i < n; i++)
{
mp[s[i]]++;
}
map<char, int>::iterator it ;
for(it = mp.begin(); it != mp.end(); it++)
{
k *= f(n, it->second);
n = n - it->second;
}
cout<<k - 1<<endl;
return 0;
}
这个方法同样显得很笨拙……(但我不想改了,时间不多了)
M Mutable Array
这个题有点小思维,就是求出最小的数,和最大的数,然后中间的数肯定能取得到
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n,ma,mi;
cin>>n>>mi>>ma;
ll a = (n - 1) * ma + mi;
ll b = (n - 1) * mi + ma;
cout<<a - b + 1<<endl;
}
N Interesting Number
这个题也是思维题,你想想只有三个因子,一个是1,一个是n,另一个必然是根号n!!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool is_prime(ll n)
{
if(n == 1)
return 0;
else
{
for(int i = 2; 1ll * i * i <= n; i++)
{
if(n % i == 0)
{
return 0;
}
}
return 1;
}
}
int main()
{
ll n;
ll sum = 0;
cin>>n;
for(int i = 2; i <=sqrt(n); i++)
{
if(is_prime(i))
{
sum++;
}
}
cout<<sum;
}
O Find Difference
又是一个思维题,就是当n不为1时,只需要一次就能算出来!!!(你可以从第i堆拿出i个硬币,然后用得到的重量减去1+2+3+……+i 就得到是哪一堆了)
#include <bits/stdc++.h>
using namespace std;
int main()
{
int n;
cin>>n;
if(n == 1) cout<<0;
else cout<<1;
}
P Dismantling Number
直接暴力啊!!!
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
int main()
{
ll n, m, i;
cin>>n;
for(int i = 1; i <= 30; i++)
{
for(int j = 1; j <= 30; j++)
{
for(int k = 1; k <= 30; k++)
{
if(pow(2, i) + pow(2, j) + pow(2, k) == n)
{
cout<<"YES";
return 0;
}
}
}
}
cout<<"NO";
return 0;
}
Q Finite Decimal
我上来的思路是分母这个数必须只有2,5这两个因子(什么?为什么?想想就知道了……),但是代码比较“丑”
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
bool is_prime(ll n)
{
if(n == 1)
return 0;
for(int i = 2; 1ll * i * i <= n; ++i)
{
if(n % i == 0)
return 0;
}
return 1;
}
int main()
{
int n, k, m, j;
cin>>n;
while(n--)
{
k = 0;
j = 2;
cin>>m;
if(m == 2)//当时写到最后就被2这个数据卡住了,但是因为debug了好久,就懒得再去改去优化,就直接一个if从句判断了
cout<<"YES"<<endl;
else if(is_prime(m) == 1 && m != 5)
{
cout<<"NO"<<endl;
}
else
{
while(1)
{
if(m % 2 == 0)
{
m = m / 2;
}
if(m % 5 == 0)
{
m = m / 5;
}
if(m % 2 != 0 && m != 1)
{
j = 0;
}
if(m % 5 != 0 && m != 1)
{
if(j == 0)
{
k = 0;
break;
}
}
if(m == 1)
{
k = 1;
break;
}
}
// cout<<m;
if(k == 1)
cout<<"YES"<<endl;
else
cout<<"NO"<<endl;
}
}
return 0;
}
后来听djk说还有一个方法,因为是要看是不是有限小数,就说明小数点后面的位数是确定的,我们可以乘以1e18,就相当于用1e18除以分母,如果能除尽,则是有限小数
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int main(){
int n;
long long int b,c;
int a;
cin>>n;
while(n--){
cin>>a;
b=1e18;
if(b%a){
cout<<"NO"<<endl;
}
else{
cout<<"YES"<<endl;
}
}
return 0;
}
还有三个题暂时不会……………………
总结:对于这次网络赛来说,比较简单,但是有些题耽误时间过多,比如那个彩票题和那个用map的题,简单来说就是题读不懂,加上不熟练,还有就编译器的问题,让我不能用浮点数,得现下Dev解决问题,然后还有就对浮点数的题做的太少,还是有待提高。