这个月确实摆了...
1.7
题意就是给出一个图,找出一条最短的路使其联通,如果找不出,输出orz 否则输出该路线的长度
就是最小生成树套板子就好
代码
#include<iostream>
#include<algorithm>
using namespace std;
const int N=1e7+5;
int pre[N];
struct node
{
int a,b,c;
}p[N];
int find(int x)
{
if(x==pre[x])return x;
return pre[x]=find(pre[x]);
}
bool cmp(node a,node b)
{
return a.c<b.c;
}
int main()
{
int n,m;
cin>>n>>m;
for(int i=1;i<=m;i++)
{
cin>>p[i].a>>p[i].b>>p[i].c;
}
sort(p+1,p+1+m,cmp);
for(int i=1;i<=n;i++)pre[i]=i;
int sum=0,ant=0;
for(int i=1;i<=m;i++)
{
int a=find(p[i].a);
int b=find(p[i].b);
if(a!=b)
{
pre[a]=b;
sum+=p[i].c;
ant++;
}
}
if(ant==n-1)
{
cout<<sum;
}
else
{
cout<<"orz";
}
}
1.8
题意: 向地上铺地毯(覆盖), 给出一个点找出最上面的垫子是第几个(可以没有)
代码
#include<iostream>
using namespace std;
#define ll long long
const ll N=1e5+5;
struct node
{
ll a,b,c,d;
}p[N];
int main()
{
int n;
cin>>n;
for(int i=1;i<=n;i++)
{
int a,b,c,d;
cin>>a>>b>>c>>d;
p[i].a=a;
p[i].b=b;
p[i].c=a+c;
p[i].d=b+d;
}
int a,b;
cin>>a>>b;
int fl=0,k=0;
for(int i=1;i<=n;i++)
{
if(a>=p[i].a&&a<=p[i].c&&b>=p[i].b&&b<=p[i].d)
{
fl=1;
k=i;
}
}
if(fl==1)cout<<k;
else cout<<-1;
}
1.9
题意: 输出多项式,给出最高次并给出各项的系数, 输出这个多项式
代码
#include<iostream>
#include<cmath>
using namespace std;
int main() {
int n;
cin >> n;
for(int i=n;i>=0;i--)
{
int a;
cin>>a;
if(a!=0)
{
if(i!=n&&a>0)cout<<"+";
if(a==-1&&i!=0)cout<<"-";
if(abs(a)>1||i==0)cout<<a;
if(i>1)cout<<"x^"<<i;
if(i==1)cout<<"x";
}
}
return 0;
}
1.10
递归求数(找规律)
以4为例
4,14,24,124这4种
多试几个数字会发现a[n]这个数列的规律
奇数的解就是奇数-1的解,偶数的解就是偶数/2的解
代码
#include<iostream>
using namespace std;
#define ll long long
const ll N=1e4+4;
ll a[N]={0,1};
int main()
{
int n;
cin>>n;
for(int i=2;i<=n;i++)
{
if(i&1)a[i]=a[i-1];
else a[i]=a[i-1]+a[i/2];
}
cout<<a[n];
}
1.11
1元3次方程...
代码
#include<iostream>
using namespace std;
double a,b,c,d;
double ac(double x)
{
return a*x*x*x+b*x*x+c*x+d;
}
int main()
{
double l,r,m,x1,x2;
int s=0,i;
cin>>a>>b>>c>>d;
for (i=-100;i<100;i++)
{
l=i;
r=i+1;
x1=ac(l);
x2=ac(r);
if(!x1)
{
printf("%.2lf ",l);
s++;
}
if(x1*x2<0)
{
while(r-l>=0.001)
{
m=(l+r)/2;
if(ac(m)*ac(r)<=0)
l=m;
else
r=m;
}
printf("%.2lf ",r);
s++;
}
if (s==3)
break;
}
return 0;
}
1.12
枚举暴力
代码
#include<iostream>
using namespace std;
int month[13]={0,31,28,31,30,31,30,31,31,30,31,30,31};
int x;
int ac(int n)
{
int ans=0,s=0;
while(n)
{
s++;
if(n%10==x)ans++;
n/=10;
}
if(s==1&&x==0)ans++;
return ans;
}
int main()
{
int n,m;
while(~scanf("%d%d%d",&n,&m,&x))
{
int ans=0;
if((n%4==0&&n%100!=0)||n%400==0)month[2]=29;
for(int i=1;i<=month[m]; i++)
{
ans+=ac(n)+ac(m)+ac(i);
}
month[2]=28;
printf("%d\n",ans);
}
}
1.13
背包
代码
#include<iostream>
#include<algorithm>
#include<cmath>
using namespace std;
int a[105], f[105][10305], n, m;
int main() {
while (~scanf("%d", &n)) {
f[0][0] = 1;
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
for (int j = 0; j <= 10000; j++) {
f[i][j] = f[i - 1][j];
}
for (int j = 0; j <= 10000; j++) {
f[i][j] |= f[i - 1][j + a[i]];
f[i][j] |= f[i - 1][abs(j - a[i])];
f[i][j] |= f[i - 1][j];
}
}
cin >> m;
for (int i = 1; i <= m; i++) {
int k;
scanf("%d", &k);
if (k > 10000) {
printf("NO\n");
continue;
}
if (f[n][k]) {
printf("YES\n");
} else {
printf("NO\n");
}
}
}
}
1.14
1.15
1.16
1.17
1.18
1.19
1.20
1.21
1.22
1.23
1.24
1.25
1.26
1.27
贪心
代码
#include<iostream>
using namespace std;
int main(){
double T,C,n;
double t[10010],v[10010];
cin>>n;
cin>>T>>C;
double tmp=T*C,v1=C,mi=10001,ma=0;
for(int i=0;i<n;i++){
cin>>t[i]>>v[i];
v1+=v[i];
tmp+=t[i]*v[i];
mi=min(mi,t[i]);
ma=max(ma,t[i]);
}
double average=tmp/v1;
if(average>=ma){
cout<<"Possible"<<endl;
printf("%.4f",average);
}
else if (average<=mi){
cout<<"Possible"<<endl;
printf("%.4f",mi);
}
else{
cout<<"Impossible"<<endl;
}
}
1.28
带权排列
#include<iostream>
using namespace std;
const int N = 1e5+5;
int main(){
int n;
scanf("%d",&n);
if(n&1){
for(int i=1;i<=n;i+=2) printf("%d ",i);
for(int i=n-1;i>=2;i-=2) printf("%d ",i);
}else {
for(int i=1;i<=n-1;i+=2) printf("%d ",i);
for(int i=n;i>=2;i-=2) printf("%d ",i);
}
return 0;
}
1.29
字符串
代码
#include<iostream>
using namespace std;
#include<cstring>
int main() {
char a[1000];
scanf("%s", a);
int l = strlen(a);
if (a[l - 1] == a[l - 2]) {
if (a[l - 3] == a[l - 4])
printf("Yes");
else
printf("No");
} else
printf("No");
}
1.30
数学
代码
#include<iostream>
using namespace std;
const long long mod=1e9+7;
int main()
{
int t;
cin>>t;
while(t--)
{
long long a,b;
scanf("%lld%lld",&a,&b);
long long num=a*b;
long long ans=0;
ans+=num*4;
ans%=mod;
ans+=(a+1)*(b+1);
ans%=mod;
ans+=(a+b)*2;
ans%=mod;
cout<<ans<<endl;
}
}
1.31
递归
代码
#include <iostream>
using namespace std;
int n, m;
void dfs(int u, int cnt, int state)
{
if (cnt + n - u + 1 < m) return ;
if (cnt == m)
{
for (int i = 0; i < n; i ++)
if (state >> i & 1)
cout << i + 1 << ' ';
cout << endl;
return ;
}
if (u == n) return ;
dfs(u + 1, cnt + 1, state | (1 << u));
dfs(u + 1, cnt, state);
}
int main()
{
cin >> n >> m;
dfs(0, 0, 0);
return 0;
}