1. 简单贪心,价格低的优先考虑。
code:
#include<cstdio>
#include<cstring>
#include<fstream>
#include<cstdlib>
using namespace std ;
#define read freopen("milk.in", "r", stdin)
#define write freopen("milk.out", "w", stdout)
struct node{
int pri, cnt ;
}q[5001] ;
int cmp(const void *a, const void *b){
return (*(node *)a).pri < (*(node *)b).pri ? -1:1 ;
}
int main(){
int m, n, i, j, sum = 0 ;
read ;
write ;
scanf("%d%d", &m, &n) ;
for(i=0; i<n; i++)
scanf("%d%d", &q[i].pri, &q[i].cnt) ;
qsort(q, n, sizeof(q[0]), cmp) ;
for(i=0; i<n; i++){
if(m<q[i].cnt){
sum += m * q[i].pri ;
break ;
}
sum += q[i].cnt * q[i].pri ;
m -= q[i].cnt ;
}
printf("%d\n", sum) ;
return 0 ;}
#include<cstring>
#include<fstream>
#include<cstdlib>
using namespace std ;
#define read freopen("milk.in", "r", stdin)
#define write freopen("milk.out", "w", stdout)
struct node{
int pri, cnt ;
}q[5001] ;
int cmp(const void *a, const void *b){
return (*(node *)a).pri < (*(node *)b).pri ? -1:1 ;
}
int main(){
int m, n, i, j, sum = 0 ;
read ;
write ;
scanf("%d%d", &m, &n) ;
for(i=0; i<n; i++)
scanf("%d%d", &q[i].pri, &q[i].cnt) ;
qsort(q, n, sizeof(q[0]), cmp) ;
for(i=0; i<n; i++){
if(m<q[i].cnt){
sum += m * q[i].pri ;
break ;
}
sum += q[i].cnt * q[i].pri ;
m -= q[i].cnt ;
}
printf("%d\n", sum) ;
return 0 ;}
2. 贪心。O(n)求出相邻两个牛的间距,对间距排序,间距大的优先舍弃。
code:
#include<cstdio>
#include<cstring>
#include<fstream>
#include<cstdlib>
using namespace std ;
#define read freopen("barn1.in", "r", stdin)
#define write freopen("barn1.out", "w", stdout)
int data[201], t[201] ;
int cmp(const void *a, const void *b){
return *(int *)a > *(int *)b ? -1 : 1 ;
}
int main(){
int m, s, c, i, j, min, max ;
read ;
write ;
scanf("%d%d%d", &m, &s, &c) ;
for(i=0; i<c; i++)
scanf("%d", &data[i]) ;
qsort(data, c, sizeof(int), cmp) ;
for(i=0; i<c-1; i++)
t[i] = data[i] - data[i+1] ;
qsort(t, c, sizeof(int), cmp) ;
s = data[0] - data[c-1] + 1 ;
for(i=0; i<m-1&&i<c-1; i++){
s -= t[i] - 1 ;
}
printf("%d\n", s) ;
return 0 ;}
#include<cstring>
#include<fstream>
#include<cstdlib>
using namespace std ;
#define read freopen("barn1.in", "r", stdin)
#define write freopen("barn1.out", "w", stdout)
int data[201], t[201] ;
int cmp(const void *a, const void *b){
return *(int *)a > *(int *)b ? -1 : 1 ;
}
int main(){
int m, s, c, i, j, min, max ;
read ;
write ;
scanf("%d%d%d", &m, &s, &c) ;
for(i=0; i<c; i++)
scanf("%d", &data[i]) ;
qsort(data, c, sizeof(int), cmp) ;
for(i=0; i<c-1; i++)
t[i] = data[i] - data[i+1] ;
qsort(t, c, sizeof(int), cmp) ;
s = data[0] - data[c-1] + 1 ;
for(i=0; i<m-1&&i<c-1; i++){
s -= t[i] - 1 ;
}
printf("%d\n", s) ;
return 0 ;}
3. 听说这题好像可以用后缀数组,试了一下没写出来。有时间再写一遍。
枚举回文串中间位置,默认为奇数长度,若是str[i]==str[i+1],则长度可能为偶数。
其实可以预处理出一个数组记录每个字母在原字符串中的位置,这样输出就不用那么麻烦了。
code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<memory>
#include<algorithm>
#define read freopen("calfflac.in", "r", stdin)
#define write freopen("calfflac.out", "w", stdout)
#define rd ifstream cout("calfflac.out") ;
#define wt ifstream cin("calfflac.in") ;
using namespace std ;
char str[20001], s[20001] ;
int main(){
read ;
write ;
int i, j, k, n=0, count=0, len ;
while(cin.get(str[n])){
if(str[n]>='a'&&str[n]<='z')
s[count++] = str[n] ;
if(str[n]>='A'&&str[n]<='Z')
s[count++] = char(str[n] + 32) ;
n ++ ;
}
int ans, max = 1, id=0, f=0 ;
for(i=0; i<count; i++){
ans = 0 ;
j = i-1 ;
k = i+1 ;
while(j>=0&&k<count){
if(s[j]!=s[k]) break ;
j -- ;
k ++ ;
ans ++ ;
}
if(max<ans){max = ans ; id = i ; f = 0 ;}
if(s[i]==s[i+1]){
j = i-1 ;
k = i+2 ;
while(j>=0&&k<count){
if(s[j]!=s[k]) break ;
j -- ;
k ++ ;
ans ++ ;
}
if(max<ans){max = ans ;id = i ;f = 1 ;}
}
}
int c = 0 ;
if(f)
ans = 2*(max + 1) ;
else
ans = 2*max + 1 ;
cout << ans << endl ;
id -= max ;
for(i=0; i<n; i++){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) c ++ ;
if(c==id+1){
c = 0 ;
while(true){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) c ++ ;
cout << str[i++] ;
if(c==ans){
cout << endl ;
return 0 ;
}
}
}
}
return 0 ;}
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<memory>
#include<algorithm>
#define read freopen("calfflac.in", "r", stdin)
#define write freopen("calfflac.out", "w", stdout)
#define rd ifstream cout("calfflac.out") ;
#define wt ifstream cin("calfflac.in") ;
using namespace std ;
char str[20001], s[20001] ;
int main(){
read ;
write ;
int i, j, k, n=0, count=0, len ;
while(cin.get(str[n])){
if(str[n]>='a'&&str[n]<='z')
s[count++] = str[n] ;
if(str[n]>='A'&&str[n]<='Z')
s[count++] = char(str[n] + 32) ;
n ++ ;
}
int ans, max = 1, id=0, f=0 ;
for(i=0; i<count; i++){
ans = 0 ;
j = i-1 ;
k = i+1 ;
while(j>=0&&k<count){
if(s[j]!=s[k]) break ;
j -- ;
k ++ ;
ans ++ ;
}
if(max<ans){max = ans ; id = i ; f = 0 ;}
if(s[i]==s[i+1]){
j = i-1 ;
k = i+2 ;
while(j>=0&&k<count){
if(s[j]!=s[k]) break ;
j -- ;
k ++ ;
ans ++ ;
}
if(max<ans){max = ans ;id = i ;f = 1 ;}
}
}
int c = 0 ;
if(f)
ans = 2*(max + 1) ;
else
ans = 2*max + 1 ;
cout << ans << endl ;
id -= max ;
for(i=0; i<n; i++){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) c ++ ;
if(c==id+1){
c = 0 ;
while(true){
if((str[i]>='a'&&str[i]<='z')||(str[i]>='A'&&str[i]<='Z')) c ++ ;
cout << str[i++] ;
if(c==ans){
cout << endl ;
return 0 ;
}
}
}
}
return 0 ;}
4. 说真的,我不知道写这种题目意义何在。
code:
#include<cstdio>
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<memory>
#include<algorithm>
#define read freopen("crypt1.in", "r", stdin)
#define write freopen("crypt1.out", "w", stdout)
#define rd ifstream cout("crypt1.out") ;
#define wt ifstream cin("crypt1.in") ;
int vis[10] ;
int main(){
int n, i, j, k, h, g, ans = 0, n1, n2, n3, n4 ;
read ;
write ;
scanf("%d", &n) ;
memset(vis, 0, sizeof(vis)) ;
for(i=0; i<n; i++){
scanf("%d", &j) ;
vis[j] = 1 ;
}
n1 = n2 = n3 = n4 = 0 ;
for(i=1; i<10; i++){
if(!vis[i]) continue ;
for(j=1; j<10; j++){
if(!vis[j]) continue ;
for(k=1; k<10; k++){
if(!vis[k]) continue ;
for(h=1; h<10; h++){
if(!vis[h]) continue ;
for(g=1; g<10; g++){
if(!vis[g]) continue ;
n1 = i * 100 + j * 10 + k ;
n2 = n1 * g ;
n3 = n1 * h ;
if(n2>=1000||n3>=1000) continue ;
int f = 0 ;
int t = n2 ;
while(t){
if(!vis[t%10]){
f = 1 ;
break ;
}
t /= 10 ;
}
if(f) continue ;
t = n3 ;
while(t){
if(!vis[t%10]){
f = 1 ;
break ;
}
t /= 10 ;
}
if(f) continue ;
n4 = n3 * 10 + n2 ;
t = n4 ;
if(n4>=10000) continue ;
while(t){
if(!vis[t%10]){
f = 1 ;
break ;
}
t /= 10 ;
}
if(f) continue ;
ans ++ ;
}
}
}
}
}
printf("%d\n", ans) ;
return 0 ;}
#include<iostream>
#include<cstring>
#include<fstream>
#include<cstdlib>
#include<memory>
#include<algorithm>
#define read freopen("crypt1.in", "r", stdin)
#define write freopen("crypt1.out", "w", stdout)
#define rd ifstream cout("crypt1.out") ;
#define wt ifstream cin("crypt1.in") ;
int vis[10] ;
int main(){
int n, i, j, k, h, g, ans = 0, n1, n2, n3, n4 ;
read ;
write ;
scanf("%d", &n) ;
memset(vis, 0, sizeof(vis)) ;
for(i=0; i<n; i++){
scanf("%d", &j) ;
vis[j] = 1 ;
}
n1 = n2 = n3 = n4 = 0 ;
for(i=1; i<10; i++){
if(!vis[i]) continue ;
for(j=1; j<10; j++){
if(!vis[j]) continue ;
for(k=1; k<10; k++){
if(!vis[k]) continue ;
for(h=1; h<10; h++){
if(!vis[h]) continue ;
for(g=1; g<10; g++){
if(!vis[g]) continue ;
n1 = i * 100 + j * 10 + k ;
n2 = n1 * g ;
n3 = n1 * h ;
if(n2>=1000||n3>=1000) continue ;
int f = 0 ;
int t = n2 ;
while(t){
if(!vis[t%10]){
f = 1 ;
break ;
}
t /= 10 ;
}
if(f) continue ;
t = n3 ;
while(t){
if(!vis[t%10]){
f = 1 ;
break ;
}
t /= 10 ;
}
if(f) continue ;
n4 = n3 * 10 + n2 ;
t = n4 ;
if(n4>=10000) continue ;
while(t){
if(!vis[t%10]){
f = 1 ;
break ;
}
t /= 10 ;
}
if(f) continue ;
ans ++ ;
}
}
}
}
}
printf("%d\n", ans) ;
return 0 ;}